• ベストアンサー

【ExcelVBA】複数の変数をセットで変えていく方法を教えてください。

VBA初心者なので非常に初歩的な質問ですみません。 複数列に入った計算式を何セットかコピーして、計算式の内容を置換していきたいのです。 8セットくらいなのでベタで書いてもいいのですが、簡潔にまとめる方法があったら教えてください。 初心者的なVBAですが、コピーは以下のように書きました。 ※作成したい計算列は8個(元を入れて) ※元の計算式は AD:AM の列に入っています。 Sub Macro1() Dim cx As Variant Dim C1 As Variant Dim C2 As Variant Dim C3 As Variant Dim C4 As Variant Dim C5 As Variant Dim C6 As Variant Dim C7 As Variant Dim C8 As Variant C1 = "AD:AM" C2 = "AO:AX" C3 = "AZ:BI" C4 = "BK:BT" C5 = "BV:CE" C6 = "CG:CP" C7 = "CR:DA" C8 = "DC:DL" Columns(C1).Select Selection.Copy For Each cx In Array(C2, C3, C4, C5, C6, C7, C8) Columns(cx).Select ActiveSheet.Paste Next End Sub このあとにコピーした計算式に含まれる列名を置換します。 ベタで書くと以下のようになります。 Columns(C2).Select Selection.Replace What:="$G", Replacement:="$J", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace What:="$F", Replacement:="$I", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False C2の範囲では$G⇒$J、$F⇒$Iと置換します。 $Gと$Fは固定です。 置換する列名は以下の通りです。 $G⇒"$J", "$M", "$P", "$S", "$V", "$Y", "$AB" $F⇒"$I", "$L", "$O", "$R", "$U", "$X", "$AA" C2~C8の範囲で上記が変化していきます。 この「セットで変化」がどうやっても解決しません。 初歩的な質問で大変申し訳ないのですが、よろしくお願いいたします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 > ベタで書くと以下のようになります。 この程度の件数なら悩むより、ベタに書いた方が話は速いですよ。 > この「セットで変化」がどうやっても解決しません。 まとめて1回で置換ということはできません。繰り返し置換するだけです。 一例です。 列全体をコピー貼り付けというのは強引過ぎる気がしますけども... Sub TestProc()     Dim r     As Range   Dim vReplaceG As Variant   Dim vReplaceF As Variant   Dim i     As Long   Const COL_SRC = "AD:AM"                   ' // 数式ソース範囲   Const COL_LST = "AO:AX,AZ:BI,BK:BT,BV:CE,CG:CP,CR:DA,DC:DL" ' // 数式貼り付け先   vReplaceG = Split("$J,$M,$P,$S,$V,$Y,$AB", ",") ' // $G 変換リスト   vReplaceF = Split("$I,$L,$O,$R,$U,$X,$AA", ",") ' // $F 変換リスト   i = 0   For Each r In Range(COL_LST).Areas     Range(COL_SRC).Copy Destination:=r     r.Replace What:="$G", Replacement:=vReplaceG(i), LookAt:=xlPart     r.Replace What:="$F", Replacement:=vReplaceF(i), LookAt:=xlPart     i = i + 1   Next End Sub

sunu0911
質問者

お礼

回答ありがとうございます。 おっしゃる通りベタで書いても問題ないのですが、 同じ様なことをよくやるので、どうにかこの機会に方法を見つけて 見たかったのです。 (結局自分で解決できずお願いしてしまいましたが) おかげさまで解決です。 非常に勉強になりました。ありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 ざっと見た感じですが、 最初のマクロは、 Sub MacroTest1()  Columns("AD:AM").Copy _  Range("AO:AX,AZ:BI,BK:BT,BV:CE,CG:CP,CR:DA,DC:DL") End Sub ということだと思います。 C2を含めて変換していくとして、絶対参照でこうなっているとすれば、 $G⇒"$J", "$M", "$P", "$S", "$V", "$Y", "$AB" $F⇒"$I", "$L", "$O", "$R", "$U", "$X", "$AA" 以下のようになると思います。 Sub MacroTest2() Dim r As Range Dim i As Long Set r = Range("C2:C8") '範囲 For i = 1 To r.Count  r.Cells(i).FormulaR1C1 = Replace(r.Cells(i).FormulaR1C1, "C7", "C" & 7 + i * 3)  r.Cells(i).FormulaR1C1 = Replace(r.Cells(i).FormulaR1C1, "C6", "C" & 6 + i * 3) Next i Set r = Nothing End Sub

sunu0911
質問者

お礼

回答ありがとうございます。 そもそも複数範囲へのコピーがこれほどあっさりできるとは・・・。 本当に素人ですみません・・・。 コピーのほうはできたのですがtest2()は、何が起きたのかわからない くらいのあいだに終了してしまって何もおきません・・・。(涙) 内容はなんとなくわかるので(なんとなくのレベルですみません) 自分でやってみます。ありがとうございました。

関連するQ&A

  • エクセルVBAの修正をお願いいたします。

    下記VBAをご教授受けて何とか作りましたが、一行指定で作成したのですが、その時によりデータ数にばらつきがありますので、現状データがあるセルだけを拾ってきてデータのあるなしを、JのセルとKのセルに2種類表示するように作成したつもりですが、データがないセルにも延々と Jのセルには 1040272 Kのセルには * が表示されますのでデータが現状ないセルには何も表示されないようにしたいと思います。 自分でいろいろ調べながらしてみるのですが埒が明かない状態になっておりますので、なにとぞお助け、ご教授をお願いいたします。 わかりにくい説明で申し訳ございませんがなにとぞよろしくお願いいたします。 Range("H2").Select ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[-5],RC[-4])" Selection.AutoFill Destination:=Range("H2:H10000") Range("H2:H10000").Select Columns("H:H").Select Selection.Copy Columns("I:I").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.Replace what:="-", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace what:="_", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Sheets("登録商品リスト").Select Columns("C:C").Select Application.CutCopyMode = False Selection.Copy Columns("E:E").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.Replace what:="_", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Selection.Replace what:="-", Replacement:="", lookat:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("F2").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=UPPER(RC[-1])" Selection.AutoFill Destination:=Range("F2:F10000") Range("F:F").Select Columns("F:F").Select Selection.Copy Columns("G:G").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet2").Select Range("J2").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=COUNTIFS(登録商品リスト!C[-3],C[-1])" Selection.AutoFill Destination:=Range("J2:J1500") Range("J:J").Select Dim i As Long, endRow As Long, str As String, c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("登録商品リスト") Set wS2 = Worksheets("Sheet2") endRow = wS2.Cells(Rows.Count, "K").End(xlUp).Row Application.ScreenUpdating = False If endRow > 1 Then Range(wS2.Cells(2, "K"), wS2.Cells(endRow, "K")).ClearContents End If For i = 2 To wS2.Cells(Rows.Count, "I").End(xlUp).Row str = Left(wS2.Cells(i, "I"), 5) Set c = wS1.Range("G:G").Find(what:=str, LookIn:=xlValues, lookat:=xlPart) If Not c Is Nothing Then wS2.Cells(i, "K") = "*" End If Next i Application.ScreenUpdating = True End Sub

  • Excelマクロ 置換について教えてください。

    A列の,10を,15に置換したいので下記マクロを記録しました。 ほかに,10を,16などにしたい場合もあるため、 入力画面を表示して初期値は,10から,15ですが、ほかを入力した場合は他の値で置換するマクロを教えてください。 Sub Macro1() Columns("A:A").Select Selection.Replace What:=",10", Replacement:=",15", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub

  • VBAで実行時エラー '1004'の解決方法

    VBA初心者です。 文字列を置換しようと思い、マクロを記録したところ下記ソースになりました。 Sub Macro1() Columns("D:D").Select Selection.Replace What:="エリア:", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub このマクロを単体で動かすと問題なく動作するのですが、他シートにおいてあるボタンに登録して一番最初に実行すると「実行時エラー '1004'」が出てしまいます。 ネットで色々調べましたが、解決方法が分かりません。 宜しくお願い致します。

  • エクセルのマクロ 大量の置換の記述を簡略化

    Cells.Select Selection.Replace What:="東京", Replacement:="東京都", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False このような置換のマクロが何十個とあって 置換前の語句と置換後の語句ごとに すべて記述していますが 「置換の記述そのものはまったく同じなので  その中に語句を順番に入れ込んでいく」 という風な記述はできるものでしょうか? もし方法があるならば御教授願いたいです 宜しくお願い致します

  • エクセルでマクロを使用しての置換

    マクロ初心者です。 データを変換するシステムをマクロで作成していますが、 自分のPCではちゃんと実行できるのに、お客さんのPCで実行するとエラーが出てしまいます。 エラーが出る部分は、どうも置換するところらしく、 Selection.Replace What:="<BR>", Replacement:="", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False ここが黄色く表示されるそうです。 どこを直せばよいですか?

  • EXCEL VBA テキストボックスの文字で置換したい

    いつもお世話になっています。 エクセルのVBAでフォームをつくり、フォーム上のテキストボックスに入力した文字でデータ変換をしようと考えています。たとえば「東京」を「東京都」という具合です。 メニューから実行すれば良いだけの話なのですが 業務上、より作業を簡素化したいためです。 下記のようにマクロを記述しましたが、うまく動作しないのでどうしてでしょうか?よろしくお願いします。 Sub 文字を置き換える() Dim mae As String Dim ato As String Columns("H:H").Select mae = UserForm1.TextBox2.Value ato = UserForm1.TextBox3.Value Selection.Replace What:=mae, Replacement:=ato, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub

  • エクセル2003で特殊文字の置換方法

    エクセル2003、XPを使用しています。 エクセルのマクロで置換をしているのですが、 置換対象がCHAR(160)です。 セル上に上のを打ち込むと、実際は違いますが半角スペースに見えます。 特殊文字であっているのでしょうか。 それで、この文字を消したいと思い、以下の通りマクロで記述しているのですが、成功しません おわかりになる方いらしたらよろしくお願いします。 Cells.Replace What:=Chr(160), Replacement:="", LookAt:=xlPart, SearchOrder:= _ xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

  • エクセル2003で、動作するでしょうか?

    現在、エクセル2007でマクロの作成練習をしていますが、 マクロの記録を使用して次のマクロを得ました。 > Columns("B:B").Select Selection.Replace What:="P", Replacement:="m" ,_ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False,_ SearchFormat:=False, ReplaceFormat:=False エクセル2003を使用している友人の依頼で作成したものですが、 当方、エクセル2003の環境がないため、動作するのか エラーが生じるのか分かりません。 どなたか教えて下さい。 エラーが出るなら、どの部分を直せばいいのかも。よろしくお願いします

  • エクセルで指定した文字に自動で置換することは可能ですか??

    A1セルに「バナナ」と表示されると下のマクロの記録で作った”置換するマクロ”の「りんご」の部分を「バナナ」に変更し、さらにこの置換マクロを自動実行することはできますか?? Sub Macro1()' Cells.Select Selection.Replace What:="名前(1)", Replacement:="りんご", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Range("A1").Select End Sub このマクロの記録でなくてもいいんですが、あるセルに置換したい文字が表示された時点でシート内の置換が実行されるようにしたいんですけど・・・・・。 よろしくお願いします。

  • 複数のシートでマクロの実行

    ブック内の全てのシートで同一のマクロを実行させたいのですが。 Sub Test() Dim ws As Worksheet  For Each ws In Worksheets  処理内容   Next ws End Sub 上記の「処理内容」が以下だと成功します。 ws.Range("A1").Value = ws.Name が、以下だと(置換処理)、一番最初のシートしか実行されません。 Range("A1:G20").Select Cells.Replace What:="A", Replacement:="B", _ LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, _ SearchFormat:=False, ReplaceFormat:=False 「Range("A1:G20").Select」の「Range」を「ws.Range」にすると、その行がエラーになってしまいます。 置換処理を全てのシートで実行させるためには、マクロをどのように直せばいいでしょうか?

専門家に質問してみよう