• ベストアンサー

Excelマクロについて

セルの番地をマクロを使って変えていきたいのですが、 例えばRange(A1)というところを(xy)のようにして、X、Yを20箇所ぐらい変えて、画像の貼付などの処理も同時に自動化していきたいのです。 Doとか使えばいいのでしょうか? 繰り返し、作業させたいのです。 わかりにくいかもしれませんが、よろしくお願いします。

noname#192965
noname#192965

質問者が選んだベストアンサー

  • ベストアンサー
  • a999a999
  • ベストアンサー率68% (11/16)
回答No.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 とすると画像選択時の「キャンセル」に 対応できます。

noname#192965
質問者

お礼

ありがとうございました。 とても役に立ちました。 何度もご回答ありがとうございました。

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

画像の個数も不定で、位置をどのようにつかんで、シートにどのように反映するかが問題ですね。 画像(図形)とセルを関連付ける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

noname#192965
質問者

お礼

とても役に立ちました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

ほんとに後半部分自信がないのですが、思ったところを述べます。 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で表すものが多いのでは ないでしょうか。セルの左上隅に位置付ける表現を許すメソド等はあるのでしょうか。

noname#192965
質問者

お礼

とても役に立ちました。 ありがとうございました。

noname#4320
noname#4320
回答No.1

こんにちは。こんな例はどうでしょう。 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 です。如何でしょう。

noname#192965
質問者

お礼

とても役に立ちました。 ありがとうございました。

関連するQ&A

  • エクセルのマクロ

    任意のセル内の文字の一部をコピー状態にした後に、任意のセルに一文字ずつ貼り付けるマクロを作成したいのですが。 例えば、A1に"あいうえお"と入力されていて、"うえお"をコピー状態にして実行すると、貼り付ける基点となるセルをインプットボックスで指定し、B3が指定されたとするなら、B3に"う"、C3に"え"、D3に"お"が貼り付けられる。 以下のマクロで望んでいる処理が可能になるのですが。 Sub test()  Set x = Application.InputBox(Prompt:="test", Type:=8)   Range("A10").Select   ActiveSheet.Paste   y = Range("A10").Value   z = 0   w = Len(y)     For i = 1 To w      x.Offset(0, z).Value = Mid(y, i, 1)       z = z + 1     Next i   Range("A10").Clear End Sub 上記マクロでは、コピー状態になっている文字を一旦作業用のセルに貼り付けるという処置を取っていますが、そのように作業用のセルを用いないで同じ処理を行うにはどうすればいいでしょうか?

  • エクセルのマクロ

    エクセルのマクロに、ついて質問です 処理の範囲をセル指定していますが セルを結合して無いシートだと問題無く処理してくれるのですが セルを結合してるシートだと処理がされません セルの番地は確認してるはずなのですが‥ 問題の可能性を教えて下さい

  • エクセルのマクロ

    Sub test() x = Selection.Row y = Selection.Column z = Selection.Columns.count Range(Cells(x, y), Cells(x, y + z - 2)).Select Selection.ClearContents End Sub 上記マクロは、同一行の連続するセルを二つ以上選択状態にして実行すると、範囲内の最も右にあるセルの値のみが残って他のセルの値は全て消去されます。 上記マクロを、複数のセレクションに対して対応できるようにするには、どうすればいいでしょうか? 例えば、c1~f1、d3~h3、e10~g10を選択して実行すると、f1とh3とg10の値のみ残って他の値は消えるということです。

  • エクセルのマクロについて

    エクセル2010を使用しています。 工程表を作成するため、以下のマクロを組もうと苦戦しています。 任意のセルを選択し、マクロを実行すると選択したセルに線を引き 線の上部にテキストボックスで文字を入力できるようにするマクロを 作成しようとしています。 また、テキストボックスは文字入力後、大きさの自動調整をかけようと しています。 線を引くところまでは、うまくいったのですがテキストボックスの挿入→入力待機 →入力後、大きさの自動調整(幅)までのマクロがよくわかりません。 可能であれば、任意の選択したセルの中央に配置をしたいです。 お知恵をお貸しください。よろしくお願いします。 koutei() Dim SentakuTop As Single Dim SentakuLeft As Single Dim SentakuWidth As Single Dim SentakuHeight As Single Dim SentakuAddress As String Dim X0, Y0, X1, Y1 As Variant SentakuAddress = Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False) With ActiveSheet.Range(SentakuAddress) SentakuTop = .Top SentakuLeft = .Left SentakuWidth = .Width SentakuHeight = .Height End With X0 = SentakuLeft Y0 = SentakuTop + SentakuHeight / 2 X1 = SentakuLeft + SentakuWidth Y1 = Y0 With ActiveSheet.Shapes.AddLine(X0, Y0, X1, Y1).Line .ForeColor.RGB = RGB(0, 0, 0) .Weight = 1 .BeginArrowheadStyle = msoArrowheadOval .EndArrowheadStyle = msoArrowheadOval End With End Sub

  • マクロに変数を代入

    題名のとおりなのですが 例えば Range("X").Select Selection.Copy Range("Y").Select ActiveSheet.Paste のXYに変数の行列 X Y a1 a2 b1 b2 c1 c3 等を代入してマクロ繰り返し試行させることは可能なのでしょうか?

  • エクセルマクロで教えてください

    エクセル2003です。 自動マクロで下記のようなマクロを造ったんですが Selection.End(xlDown).Select   Range("A29:D29").Select  ■A29を止まったセルの番号にしたいのです。(A**からD**まで)     With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("A30").Select ■A30を止まったセルの番号にしたいのです 以上2箇所の指定を教えていただけますでしょうか。 よろしくお願いいたします。

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

  • エクセルのマクロについて

    エクセルのマクロについて 領域の範囲選択→貼り付けの繰り返し処理をループで考えています。 領域の範囲選択し、貼り付け処理をマクロの自動記録で、出してみました。 Sub Macro1() Range("E6:G12").Select Selection.Copy Range("E17").Select ActiveSheet.Paste Application.CommandBars("Stop Recording").Visible = False End Sub この時に、「Range("E17").Select」の命令は「Cells」関数に置き換えられるのですが、「Range("E6:G12").Select」のように複数のセルの領域選択をする際に、「Cells」関数ではできないのでしょうか。 「Cells」関数を使えば、行列を数値にし、変数を使えば、LoopかFor命令で繰り返し処理ができるのですが、わかる方、解答ください。よろしくお願いします。

  • EXCEL マクロ

    エクセルマクロ初心者です。 エクセル2007で、複数選択したセルの合計値・平均値をコピーできないか悩んでいます。作業によって、選択するセルが変わりますので、セル番地の指定をせずにマクロの書くことができますでしょうか。 イメージとしては、複数のセルを選択をしたときに、ステータスバーにオートカルクで表示される合計値・平均値をクリップボードにコピーし、別のセルに結果をペーストする感じ(ペーストする際に合計値・平均値のどちらを貼り付けるか選択できれば尚、良)です。 個人用マクロブックに登録して、不特定ブックで使用したいマクロです。よい方法があれば教えて下さい。

  • Excelのマクロに関して

    Excelのマクロで特定のセルに特定の数値が入力されている場合、違うセルにある文字列を入力させる場合 すいません。 説明がものすごく悪くて申し訳ないのですが。 A列(行は100くらいまで)に「100」の数値が入力されている場合に、同じ行のE列に文字列「○○」を返す場合は どのようなマクロを使ったらよろしいですか。 会社の人が Sub TimeIntervalPaint() Dim x As Integer, op As Integer Dim TI As Range Application.ScreenUpdating = False Cells.Interior.ColorIndex = xlNone op = Range("B3").End(xlDown).Row Range("E3:BF" & op).ClearContents Call WorkTime For x = 3 To 150 If Range("A" & x).Value = "101" Then If TI Is Nothing Then Set TI = Union(Range("L" & x), Range("AD" & x), Range("T" & x, "W" & x)) Else Set TI = Union(TI, Range("L" & x), Range("AD" & x), Range("T" & x, "W" & x)) End If こういったマクロを登録しているのですが、新たにE列に文字列を入力できるように改良したいのです。 既に退職していて聞くことすら出来ません。 説明がものすごく悪いのは分かっていますが、どなたかご教授ください。

専門家に質問してみよう