- ベストアンサー
Excelマクロについて
セルの番地をマクロを使って変えていきたいのですが、 例えばRange(A1)というところを(xy)のようにして、X、Yを20箇所ぐらい変えて、画像の貼付などの処理も同時に自動化していきたいのです。 Doとか使えばいいのでしょうか? 繰り返し、作業させたいのです。 わかりにくいかもしれませんが、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Rengeと同じもので Cellsというものがあります。 これは数字座標で書くもので Range(D2)なら Cells(2,4)と数字で行、列の順に指定します。 変数も可能で 行 = 2 列 = 4 Cells(行,列).Select とできます。 3行目、6行目、9行目に画像を貼るなら 処理ごとに 行 = 行 + 3 Cells(行,列).Select とします。 規則性が無い場合は質問下さい。 貼り付ける写真の数が決まっていれば For カウンタ = 1 To 最後の数 処理-画像を呼び出すなど- Next ちなみに下は Application.Dialogs(xlDialogInsertPicture).Show 結果 = Application.Dialogs(xlDialogInsertPicture).Show if 結果 = false then exit sub endif とすると画像選択時の「キャンセル」に 対応できます。
その他の回答 (3)
- nishi6
- ベストアンサー率67% (869/1280)
画像の個数も不定で、位置をどのようにつかんで、シートにどのように反映するかが問題ですね。 画像(図形)とセルを関連付けるTopLeftCellプロパティは値の設定はできないはずなので、Top、Leftを使って座標指定することになるのでしょうか。 その前提で処理例を書いてみました。数種のjpeg画像(Picture)と図形で検証しました。 ●画像の位置を取得<get_ShapesPot()> 画像があるシートをSheet1として、Sheet2に画像の情報『セル座標・行位置・列位置・画像名』と 表題『新・行位置・新・列位置』を書きます。 画像は既にSheet1にテキトーに貼り付けられているとしています。 ●画像を指定位置にセット<set_ShapesPot()> Sheet2のE、F列『新・行位置・新・列位置』に配置しなおす位置を入力します。 元の『行位置・列位置』を参考にすれば入力しやすいでしょう。 set_ShapesPotを実行すれば、全ての画像を指定した位置に再配置します。 2つのマクロをショートカットキーに割り当てれば操作性も上がるでしょう。 標準モジュールに貼り付けます。ご参考に。(Excel2000です) ↓ここから Dim wsShp As Worksheet '画像のあるシート Dim wsPot As Worksheet '画像位置を表示するシート Dim c As Integer '行カウンタ '画像の位置を取得 Sub get_ShapesPot() Dim shp As Shape '画像 Set wsShp = Worksheets("Sheet1") Set wsPot = Worksheets("Sheet2") c = 0 With wsPot .Range("A1:D1") = Array("セル座標", "行位置", "列位置", "図形名") .Range("E1:F1") = Array("新・行位置", "新・列位置") For Each shp In wsShp.Shapes c = c + 1 .Range("A" & c + 1) = shp.TopLeftCell.Address(False, False) .Range("B" & c + 1) = shp.Top .Range("C" & c + 1) = shp.Left .Range("D" & c + 1) = shp.Name Next End With End Sub '画像を指定位置にセットする Sub set_ShapesPot() Set wsShp = Worksheets("Sheet1") Set wsPot = Worksheets("Sheet2") Application.ScreenUpdating = False wsPot.Activate On Error GoTo ErrorHandler c = 2 While wsPot.Range("D" & c) <> "" wsShp.Shapes(Range("D" & c)).Top = Range("E" & c) wsShp.Shapes(Range("D" & c)).Left = Range("F" & c) c = c + 1 Wend wsShp.Activate Application.ScreenUpdating = True Exit Sub ErrorHandler: Resume Next End Sub
お礼
とても役に立ちました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
ほんとに後半部分自信がないのですが、思ったところを述べます。 Sub test01() i = Array(0, 1, 3, 5, 7) '1,2,3,5,7列 j = Array(0, 2, 3, 7, 9) '2=B、3=C,7=G,9=Iの要領で入れて '下さい。小さいもの順である必要なし。 ' 上の例では、 i と j のペアーでB1,C3,G5、I7を表します ’------ For k = 1 To 4 Worksheets("sheet1").Cells(i(k), j(k)) = "a" ' ="a"はこの例では、一定値にしていますが、値や数値であれば ' 配列で処理できます。 ' l=array("0","west","east","north","south")とし ' ="a"のところを,=l(k)にします。#1の解答もここまでしか 答えていないのですが、私ならこの後の画像のセットが難しいと思うので説明が要ると思う。 画像等のファイル名を指定する必要があれば、サブルーチンの 引数をファイル名にして, ' ファイル名のストリングを配列化してください. ' フルパス名の最後辺りの、変わる部分のみを配列化して ' GETPICTURE関数のような関数の引数=不変部分 & (k) 'とすることになるでしょう。 ' そしてコピーできるものなら、貼りつけるセルを ' Worksheets("sheet1").Cells(i(k), j(k)).selectして ' ActiveSheet.Paste することになるのでしょうか。 ' この部分の経験と自信がありません。 Next k エクセルで画像やオブジェクトを表示する位置をしめすのは LEFT,TOP,WIDE、HEIGHTで表すものが多いのでは ないでしょうか。セルの左上隅に位置付ける表現を許すメソド等はあるのでしょうか。
お礼
とても役に立ちました。 ありがとうございました。
こんにちは。こんな例はどうでしょう。 A1のセルを基準にして、行、列をオフセット値で指定します。 ここで、 Range("A1")はRange("A1").Offset(0,0) Range("B2")はRange("A1").Offset(1,1) のことです。 B1を左端上とする領域に、九九の表を作ってみます。 Sheet1がアクティブになった時じ実行されるマクロとして、 Private Sub Worksheet_Activate() For r = 1 To 9 For c = 1 To 9 Sheet1.Range("A1").Offset(r, c).Value = r * c Next c Next r End Sub です。如何でしょう。
お礼
とても役に立ちました。 ありがとうございました。
お礼
ありがとうございました。 とても役に立ちました。 何度もご回答ありがとうございました。