VBA複数シートに渡る連想配列と年間集計

このQ&Aのポイント
  • VBAを使用して、複数のシートにわたる連想配列を作成し、年間集計シートに書き出す方法について教えてください。
  • 質問者はWin7とExcel2013を使用しています。シート2のA列の科目を連想配列のキーとし、シート2以降のシートのB列とC列のデータを同時に格納したいと考えています。
  • また、6月には4~5月の2ヶ月分、7月には4~6月分の3ヶ月分のデータを集計したいそうです。質問者が試したコードにエラーが発生し、うまく動作しないため、解決策を教えてほしいとのことです。
回答を見る
  • ベストアンサー

VBA 複数シートに渡る連想配列

Winは7、Excelは2013を使用しています。 画像の様に、シート2のA列の科目を連想配列のキーし、 シート2以降のシートのB列とC列のデータを同時に格納していきたいと思っています。 6月には、4~5月の2ヶ月分、7月には4~6月分の3ヶ月分、となるので、 シートの数だけ繰り返したいです。 それで、下記を自分で考えてみたのですが、 数々エラーになり、上手く行きません。 どなたか、ご教示頂けます様お願い致します。 Sub test_年間() '--------------------------------------- '科目を連想配列に登録し、年間集計シートに書き出す '--------------------------------------- Dim n As Integer Dim maxRow As Integer Dim Dic(36) Dim buf As String Dim Keys Dim k As Integer Dim a As Integer For s = 2 To Worksheets.Count Sheets(s).Activate maxRow = Range("A65536").End(xlUp).Row '------------------------------------ '格納 '------------------------------------ Set Dic(s) = CreateObject("Scripting.Dictionary") For n = 2 To maxRow buf = Cells(n, 1).Value 'A列のセルの値をbufに格納する b = Cells(n, 2).Value 'B列のセルの値をbに格納する c = Cells(n, 3).Value 'C列のセルの値をcに格納 If buf = "" Then '空白セルではなく ElseIf Not Dic(s).Exists(buf) Then '辞書にまだ登録されていなければ Dic(s).Add buf, b 'そのセルの値を連想配列に登録する。 'ここで Dic(S+1).Add buf, c のような事がしたいのですが.... 'でもS+1はエラーになります。 End If Next n Next s '--------------------------------------------- '書き出す '--------------------------------------------- For s = 2 To Worksheets.Count Keys = Dic(s).Keys Worksheets("年間集計").Activate With Worksheets("年間集計") k = 1 a = 1 r = 0 For n = 0 To Dic(s).Count - 1 k = k + 1 '最初の書き出しは2行目から Cells(k, 1 + r) = Keys(n) Cells(k, 2 + r) = Dic(s)(Keys(n)) ' Cells(k, 3 + r).NumberFormatLocal = "[h]:mm" ' Cells(k, 3 + r) = Dic(s + 1)(Keys(n)) r = r + 3 Next n End With Next s Set Dic(s) = Nothing MsgBox "終了" End Sub 勝手申しますが、お礼は来週月曜日なります。 どうかお許し願います。

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

  • ベストアンサー
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.2

Sheet2、Sheet3のB列、C列に項目名を付けておきましょう(添付図参照)。 Sub Sample()   Dim sArray() As String   ReDim sArray(Sheets.Count - 2) As String   For i = 2 To Sheets.Count     sShtName = Sheets(i).Name     sShtAddress = Sheets(i).Range("A2").CurrentRegion.Address(, , xlR1C1)     sArray(i - 2) = sShtName & "!" & sShtAddress   Next i   Sheets(1).Range("A1").Consolidate Sources:=sArray, Function:=xlSum, TopRow:=True, LeftColumn:=True, CreateLinks:=False End Sub データの統合機能を使っています。

6338-tm
質問者

お礼

mt2015様 ご回答いただきありがとうございます。 また昨日お礼コメントをするはずが、遅くなってしまい申し訳ありません。 まだ実際に使用出来ていないのですが、 書いて下さった構文をよく拝見し勉強させて頂きたいと思っています。

その他の回答 (4)

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.5

違っています。“."のついている所が入力元で、ついていないところが出力先です。 出力先が今まで通りA列の場合   For Row = 2 To .[A65536].End(xlUp).Row の様に“."の有る所は直す必要があります。       Set Find = [A:A].Find(What, LookAt:=xlWhole) の様に“."の無い所は直してはいけません。 出力先もM列からにしたいなら、全体にそのような修正をした上で、     Col = Sheet * 2 + 10 に直します。Col は列です。M列は13番目なので、13-3で出します。 Sheet は2から始まるので、こうすれば最初は2*2+10は14、つまりN列になります。 項目名を変更しても構わないのであれば、mt2015さんのやり方の方が優れていると思います

6338-tm
質問者

お礼

SI299792様 ご回答ありがとうございます。 変更する事ができました。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.4

ANo.2です。 「データの統合」について説明しておいた方が良いかと思ったので再度回答します。 以下の様な操作をしてみてください。 1.ANo.2の添付図の様に、Sheet2とSheet3のB1、C1に項目名を入れます。この時、「4月時間」の様に他とダブらない名前にします。 2.Sheet1のA1を選択した状態で、メニューのデータ→データツール→統合を選択します。 3.「統合の設定」ダイヤログで集計の方法:合計を選択 4.統合元範囲でSheet2のA1:C5を指定し、<追加>ボタンで統合元に追加。 5.同様に統合元範囲でSheet3のA1:C5を指定し、<追加>ボタンで統合元に追加。 6.統合の基準で、上端行と左端列にチェックをつけて<OK>ボタンを押下 これでSheet1にご希望の表が作成されたはずです。 同じことをSheet2以降の全てのシートのA2を含むセル範囲を統合元にしたものがANo.2のコードです。

6338-tm
質問者

お礼

mt2015様 いつも丁寧に解説下さり、ありがとうございます。 この回答だけお礼コメントが遅くなってしまい、申し訳ありません。 手作業でもこういう方法があるのは知りませんでした。 他の方に指摘されましたが、 Excelの色々な機能を知った上で、それがVBAにもつながるのですね。 VBAで作業を効率化したいと思っているだけでは良くないのかもしれませんが、 勉強して行きます。

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

今更、質問者は、自分のやりかけた方法を変えるのは、非常に苦痛だろうから、下記は、今後の勉強ぐらいと思って読んでください。 ーー (1)今後いろいろ勉強して、このタイプの課題に、プロなどは、連想記憶を使っているか、勉強することを強く勧める。どこかで連想記録を学んで、これは便利とほれ込んで使ったのだろうが、やりすぎと思う。小生は、「牛刀をもって鶏を割く」という古来の言葉を思い出した。 (2)普通はSQLなどを使って、情報を結合するだろう。 SQLつかソフトが、簡単に、使えない時代は、マッチングのアルゴリズムを使ってやっていた。 (3)下記は「Find法」ともいえるものでしょう。 毎レコードFindメソッドを使うので、処理速度的には、速いとは言えないと思う。 しかし、昔の紙ベースの作業の方式(コンピュターを使わない人が、目視で目的の表を作るときはどういうプロセスをやるか)を、なぞったやりかたなので、だれにもわかりやすいロジックです。VBAのコード数も、多分、他と比べて、少ないでしょう。 こちらの方法も、あまり見かけないけどね。 ーー 例データ Sheet2 A1:C6 科目 情報1 情報2 国語 12  46 理科 13  78 音楽 56  78 英語 23  56 図工 34  89 ーー Sheet3 A1:C6 科目 情報1 情報2 国語 12  34 英語 23  45 理科 13  56 図工 34  76 音楽 56  26 Sheet2とSheet3は、行的にまたデータ数値が違う例。 ーー 標準モジュールに Sub test01() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") Set sh3 = Worksheets("Sheet3") Worksheets("Sheet2").Range("A1:C6").Copy Sheets("Sheet1").Range("A1") For i = 2 To 6 Key = sh1.Cells(i, "A") r = sh3.Columns("A").Find(Key).Row 'MsgBox r Worksheets("sheet1").Cells(i, "D") = Cells(r, "B") Worksheets("sheet1").Cells(i, "E") = Cells(r, "C") Next i sh3.Range("B1:C1").Copy sh1.Range("D1") End Sub ーー 実行する。 結果 科目 情報1 情報2 情報1 情報2 国語 12  46  12  34 理科 13 78 13  56 音楽 56  78  56  26 英語 23  56  23  45 図工 34  89  34  76 ーー 上記サンプルは、行数も、6と両方一致の例でやっているし、コードも行数6は行数を、相対化してなくて、少数例で手抜きしてます。 項目も、両方シートに、もれなく出現する例にしてます。 この点について、両シートで同じでない場合だと、そこがこのやり方のウイークポイントです。

6338-tm
質問者

お礼

imogasiさま 色々ご教示頂きありがとうございます。 私が考えた構文では行き詰まっていたので、 それより良い方法を教えて下さってありがたいです。 こういう表が良いという指示された年間集計の表があって、 それを手作業でやることはできますが、時間がかかるので、 マクロで何とかパっと処理したいというのが今の状況です。 書いて下さった構文をよく拝見し、勉強させて頂きます。

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.1

 この場合、連想配列は使わない方がいいです。面倒なだけです。Findなら、プログラムも簡単だし、実行速度も速いです。Findを使ったプログラムです。 ' Option Explicit ' Sub Macro1() '   Dim Sheet As Integer   Dim Col As Integer   Dim Row As Long   Dim What As String   Dim Find As Range   Dim RowOut As Long '   Sheets("年間集計").Select   Cells.ClearContents '   For Sheet = 2 To Sheets.Count     With Sheets(Sheet)     Col = Sheet * 2 - 2     Cells(1, Col) = .Name & .[B1]     Cells(1, Col + 1) = .[C1]     Columns(Col + 1).NumberFormatLocal = "h:mm;@" '     For Row = 2 To .[A65536].End(xlUp).Row       What = .Cells(Row, "A")       Set Find = [A:A].Find(What, LookAt:=xlWhole) '       If Find Is Nothing Then         RowOut = [A65536].End(xlUp).Row + 1       Else         RowOut = Find.Row       End If       Cells(RowOut, "A") = What       Cells(RowOut, Col).Resize(1, 2) = .Cells(Row, "B").Resize(1, 2).Value     Next Row     End With   Next Sheet End Sub  OKWAVEは、勝手に回答を改ざんします。この回答も改ざんされ、プログラムが動かなくなる可能性があります。他の質問サイトにした方が確実です。

6338-tm
質問者

お礼

SI299792様 ご回答いただきありがとうございます。 またお礼が遅くなってしまい申し訳ありません。 こういう時はFindを使ったプログラムのが良いのですね。 他の作業を言いつけられてしまい、 昨日今日と実際に使ってみる時間が取れていないのですが、 書いて下さったコードをよく拝見し、勉強させて頂きます。 ご教示頂きありがとうございます。

6338-tm
質問者

補足

SI299792様 もしよろしければ、申し少し教えて下さい。 各月のデータで、M~O列にあるデータも同じ様に処理したい場合、 この構文を使う事ができますか? Option Explicit ' Sub Macro1() ' Dim Sheet As Integer Dim Col As Integer Dim Row As Long Dim What As String Dim Find As Range Dim RowOut As Long ' Sheets("年間集計").Select Cells.ClearContents ' For Sheet = 2 To Sheets.Count With Sheets(Sheet) Col = Sheet * 2 - 2 Cells(1, Col) = .[N1] Cells(1, Col + 1) = .[O1] Columns(Col + 1).NumberFormatLocal = "h:mm;@" ' For Row = 2 To .[A65536].End(xlUp).Row What = .Cells(Row, "M") Set Find = [M:M].Find(What, LookAt:=xlWhole) ' If Find Is Nothing Then RowOut = [M65536].End(xlUp).Row + 1 Else RowOut = Find.Row End If Cells(RowOut, "A") = What Cells(RowOut, Col).Resize(1, 2) = .Cells(Row, "B").Resize(1, 2).Value Next Row End With Next Sheet End Sub であってますか?

関連するQ&A

  • VBA 複数のシートをまたいでの連想配列

    win7、Excelは2013を使用しています。 添付画像の様に、12シートの合計を連想配列に格納しsheet13に書き出したいのですが、プロシージャーの下から6行目のところで、エラーコード451が出ます。 どの様に変更すれば良いか教えて下さい。 Sub 年間集計() Dim Dic Dim i As Integer Dim j As Integer Dim sh As Worksheet Dim rng As Range Dim buf As String Dim num As Integer Set Dic = CreateObject("Scripting.Dictionary") For Each sh In Worksheets For Each rng In sh.Range("J2", sh.Cells(Rows.Count, 10).End(xlUp)) buf = rng.Value num = rng.Offset(, 1).Value If Not Dic.Exists(buf) Then Dic.Add buf, num Else Dic.Item(buf) = Dic.Item(buf) + num End If Next rng Next sh j = 2 With Worksheets("Sheet13") For i = 0 To Dic.Count - 1 .Cells(j, 1) = Dic.Keys(i)   ’エラー箇所 .Cells(j, 2) = Dic.Items(i) j = j + 1 Next i End With End Sub

  • VBA 連想配列と回数

    Widowsは7 Excelは2013を使用しています。 E列のデータの重複しないリストをK列に書きだすところまでは出来たのですが、 同じ商品名が何回出てきたをカウントしたいのですが、 下記の連想配列で一緒に出来るのか、分けて組まないといけないのか、 教えて下さい。 よろしくお願い致します。 '---------------------------- '重複しないリストをK列に書き出す '---------------------------- Dim Dic, i As Long, buf As String, Keys Set Dic = CreateObject("Scripting.Dictionary") For i = 2 To maxRow buf = Cells(i, 5).Value 'E列のセルの値をbufに格納する If Not Dic.Exists(buf) Then '辞書にまだ登録されていなければ Dic.Add buf, buf 'そのセルの値を連想配列に登録する。 End If Next i '出力 Keys = Dic.Keys For i = 0 To Dic.Count - 1 Cells(i + 2, 11) = Keys(i) 'K2から下にリスト作成 Next i Set Dic = Nothing End Sub

  • VBA 時間の足し算

    windowsは7、Excelは2013を使用しています。 下記のマクロで、Q列のキーワードを基に、 Q列=H列の時に、C列の時間(表記は、1:00:00)をnに格納していき、 時間の合計を、S列に入る様にしていますが、 C列の値が、0:30:00や0:15:00などの場合、 S列に入る値が 0.291666666666667 とかに小数点以下の値になってしまいます。 例えば、1:00:00+0:30:00+0:45:00=2:15という値が帰ってくるようにするにはどうしらいいのか教えて下さい。 あと、もし合計が24以上になった場合、25や26などの値になる様にもしたいです。 よろしくお願い致します。 -------------------------------------- Sub test() Dim h As Integer Dim q As Integer Dim n As Variant Dim maxRow As Integer maxRow = Range("A65536").End(xlUp).Row For q = 2 To 10 n = 0 For h = 2 To maxRow If Cells(q, 17) = Cells(h, 8) Then n = n + Cells(h, 3).Value End If Next h Cells(q, 19).Value = n Next q

  • VBA スケジュール表作成_連想配列で祝日設定

    Win10でExcelは2016を使用しています。 「西暦」をMsgBoxで指定し、スケジュール表を作成するマクロを作成中です。 日曜と祝日のセルをグレー&赤文字にさせたいので、別シートに祝日を表にしそれを連想配列に記憶させて、祝日も赤文字にさせたいのですが、下記のマクロですと祝日の曜日のセルをグレー&赤文字に出来ず行き詰っています。 ------ Sub スケジュール_日_祝_休ver() Dim ws1 As Worksheet Dim myDic As Object Dim buf As String Dim i As Integer Dim Keys() As Variant Dim ws2 As Worksheet 'シート Dim ye As Integer '年 Dim mo As Integer '月 Dim dy As Integer '日 Dim dLast As Integer '最終日 Dim r As Integer '日付書き込み列 Set myDic = CreateObject("Scripting.Dictionary") Set ws1 = Worksheets("祝日") maxRow = ws1.Range("C65536").End(xlUp).Row For i = 2 To maxRow buf = ws1.Cells(i, 3).Value 'C列のセルの値をbufに格納する If buf = "" Then '空白セルではなく ElseIf Not myDic.Exists(buf) Then '辞書にまだ登録されていなければ myDic.Add buf, 1 'そのセルの値を連想配列に登録する。 End If Next i ye = Application.InputBox("西暦を入れて下さい", Type:=1) Set ws2 = Worksheets("白紙") With ws2 r = 2 '当年1~12月 '1日の列に月を表示 For mo = 1 To 12 If mo = 1 Then .Cells(1, r) = "’" & ye & "年" & mo & "月" .Cells(1, r).Font.Bold = True .Cells(1, r).Font.Name = "HGP創英角ゴシックUB" .Cells(1, r).Font.Size = 20 Else .Cells(1, r) = mo & "月" .Cells(1, r).Font.Bold = True .Cells(1, r).Font.Name = "HGP創英角ゴシックUB" .Cells(1, r).Font.Size = 20 End If '最終日取得 dLast = Day(DateSerial(ye, mo + 1, 0)) '日にちと曜日を入れ、日・祝 のセルをグレー&赤文字 For dy = 1 To dLast .Cells(3, r) = ye & "/" & mo & "/" & dy .Cells(3, r).NumberFormatLocal = "d" .Cells(4, r) = WeekdayName(Weekday(.Cells(3, r).Value), True) Key = .Cells(3, r).Value If .Cells(4, r).Value = "日" Or .Cells(3, r).Value = myDic.Item(Key) Then '日と祝日 .Cells(4, r).Font.ColorIndex = 3 ws2.Range(Cells(5, r), Cells(73, r)).Select With Selection.Interior .ColorIndex = 15 End With End If r = r + 1 Next dy '月変わりに縦太線を引く .Range(Cells(1, r - 1), Cells(73, r - 1)).Select With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Next mo End With End Sub ------- 原因をさぐるべくF8で確認しながら進めたところ、 「If .Cells(4, r).Value = "日" Or .Cells(3, r).Value = myDic.Item(Key) Then 」 のところで、.Cells(3, r).Value は「2020/1/1/」でmyDic.Item(Key)は「2020/01/01/」になっていました。 やはり、これですと同じとは認識されないのでしょうか? でも、月日が2ケタの祝日のセルをグレー&赤文字にならず、他の原因のような気もします... -- どなたかご教示頂けましたら有難いです。 よろしくお願い致します。

  • 以下のデータがあり、これをExcel VBAの連想配列として格納したい

    以下のデータがあり、これをExcel VBAの連想配列として格納したいと考えています。 MsgBoxでキーとアイテムを表示させると表示されるのですが、 最後に一例としてExistsで確認するとFalseが返ってきます。 これは配列に格納されていないのでしょうか。 また格納されていないとすると、どうすれば格納できるのでしょうか。 A 列   B列 35   apple 37   orange 40   banana 以下がコードです。 sub test() Dim i as integer Dim myDic as Object Dim keys as Variant Set myDic = CreateObject("Scripting.Dictionary") For i = 1 to 3 myDic.Add Cells(i, 1), Cells(i, 2) Next i keys = myDic.keys For Each keys In myDic MsgBox "キー名:" & keys & vbCr & "値:" & myDic.Item(keys) Next keys MsgBox myDic.Exists(35) End Sub

  • 対象のシートが3行目からになった修正について

    対象のシートが3行目からになってしまったのですが、修正したいのですが、どこを修正したらよいかが分からず、困っています。お教え頂けませんか。よろしくお願いします。初心者で申し訳ありません。 Sub 統合() Dim J As Long Dim r As Long Dim s As Long Dim Sh As Worksheet Dim MaxRow As Long Dim MaxCol As Long Dim MyArray As Variant Dim JoinSh As Worksheet Set JoinSh = Worksheets("統合") '統合シートを変数に格納 JoinSh.Cells.Delete 'すでに統合シートが存在する場合は一旦セルを削除 s = 1 '最大行を超えた場合次の統合シートを作成するための番号 For i = s + 1 To Worksheets.Count 'シートを統合シートの次~末尾までループ With Worksheets(i) '各月シート If J = 1 Then r = 1 '最初だけ項目も取得 Else r = 1 '最初以外は2行目から取得 End If MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '9列目で最終行を取得 MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column '1行目で最終列を取得 MyArray = Range(.Cells(r, 10), .Cells(MaxRow, MaxCol)) 'A1~データ末尾まで配列に格納 End With With JoinSh '統合シート MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 If MaxRow + UBound(MyArray) > Rows.Count Then '最大行を超える場合の処理 s = s + 1 '統合シートの番号を加算 Worksheets.Add Before:=Worksheets(s) '新規に統合シートを追加 ActiveSheet.Name = "統合" & s '名前が同じにならないように番号を追加 Set JoinSh = ActiveSheet '統合シートを変数に格納 MaxRow = JoinSh.Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 End If If .Cells(1, 1) = "" Then '最初だけ1行目から貼り付け Range(.Cells(1, 1), .Cells(UBound(MyArray), MaxCol)) = MyArray Else '最初以外は最終行の次に貼り付け Range(.Cells(MaxRow + 1, 1), .Cells(MaxRow + UBound(MyArray), MaxCol)) = MyArray End If End With Next i End Sub

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • エクセルVBA(掛け算)

    いつもおせわになります。 現在、下記のようなコードを書いてますがどうもうまくいきません。よろしくお願いいたします。 M列 = K列 × N列を6行目から最終行目で入れたくて下記のようなコードを書きました。 ところが・・・N列にはデータのない場合があるので、If~を入れてみました。ここまではうまくいったのですが、 O列 = K列 × P列のように数式を入れたい列が他にもあり、又同じコードを下記のように書いたら、P列にデータがないところで止まってしまいます。 '///////////////////////////////////////////// Dim wsS As Worksheet Dim r As Long Dim Srow As Long Set wsS = Worksheets("syukei") Srow = wsS.Range("D65536").End(xlUp).Row With Worksheets("syukei") For r = 6 To Srow If Cells(r, 12) = Noting Then r = r End If Cells(r, 13) = Cells(r, 11) * Cells(r, 12) Next End With With Worksheets("syukei") '↓////////ここらへんで止まる////////// For r = 6 To Srow If Cells(r, 14) = Noting Then r = r End If Cells(r, 15) = Cells(r, 11) * Cells(r, 14) Next End With End Sub 掛け算を入れたい行は、下記のようになっています。 M列=K列×L列 O列=K列×N列 Q列=K列×P列 S列=K列×R列 U列=K列×T列 W列=K列×V列 Y列=K列×X列 よろしくお願いいたします。

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • VBAプログラミングの質問です。

    Sheet1の第2列に行番号、4列に列番号、5列にそこの値が書かれたデータが並んでいます。 1 1 967 2 1 687 ……… x y 802 ……… x行、y列に802を代入するという感じです。全部で57985データあります。 前の回答を参考にして、48881データまではSheet2に For k = 1 To 48881 Worksheets("Sheet2").Cells(1 + Worksheets("Sheet1").Cells(k, 2), 1 + Worksheets("Sheet1").Cells(k, 4)) = Worksheets("Sheet1").Cells(k, 5) Next k このようにプログラムを書いて納まって、残りの57985-48881=9104データの行列はSheet2に納まらなかったので、Sheet3に書こうと思い、下のように書きましたがプログラムがうまく動きませんでした。他にも試しましたが初心者のためダメでした。 Dim n As Long Dim m As Long n = 9104 m = 48881 For k = 1 To n Worksheets("Sheet3").Cells(1 + Worksheets("Sheet1").Cells(k + m, 2), 1 + Worksheets("Sheet1").Cells(k + m, 4)) = Worksheets("Sheet1").Cells(k + m, 5) Next k 48881というのが大きいため動かないと考えられますが、どのように対処したらよいかわかりません。教えてください。お願いします。

専門家に質問してみよう