VBA 連想配列と回数

このQ&Aのポイント
  • VBAを使用して、Excelの重複しないデータリストに対してカウントを行う方法を教えてください。
  • 連想配列を使用して商品名の重複回数をカウントする方法を教えてください。
  • ExcelのVBAを使用して、重複しないデータリストに対して回数をカウントしたいのですが、どのように実装すればよいですか?
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>E列からI列まで一括で出来ますか? 各列の最終行がE列と同じなら Sub Test2()   Dim Dic As Object, c As Range   Set Dic = CreateObject("Scripting.Dictionary")   For Each c In Range("E2:I" & Cells(Rows.Count, "E").End(xlUp).Row)     Dic(c.Value) = Dic(c.Value) + 1   Next   '出力   Range("K2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Keys)   Range("L2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Items)   Set Dic = Nothing End Sub 各列の最終行がE列と異なるのなら Sub Test3()   Dim Dic As Object, i As Long, j As Long, buf As String   Set Dic = CreateObject("Scripting.Dictionary")   For i = 5 To 9 'E列からI列     For j = 2 To Cells(Rows.Count, i).End(xlUp).Row       buf = Cells(j, i).Value       Dic(buf) = Dic(buf) + 1     Next j   Next i   '出力   Range("K2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Keys)   Range("L2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Items)   Set Dic = Nothing End Sub

6338-tm
質問者

お礼

watabe007様 E~Iまで書き出す事ができました! 私がE2→E最終行→F2→F最終行・・・・・という様に書き出したい事を、質問で説明していなかったでしで、少し思ったのと違う結果になってしまいました。 申し訳ありませんが、もう少し考えてみます。 ご回答いただきました事、感謝致します。 ありがとうございました。

6338-tm
質問者

補足

watabe007様 質問の返答を頂き、色々パターンを書いてくださって有り難く思います。 最終行が同じ方を組み込んでみたいです。 今は手元にないので、月曜日にやってみます。 お礼コメントは、その後に書かせていただきたいので、 少し時間を下さい。 本当にありがとうございました。

その他の回答 (4)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

>私がE2→E最終行→F2→F最終行・・・・・という様 ??? E列の重複しないリストと重複数は、K、L列に F列の重複しないリストと重複数は、M、N列に ・・・ なら Sub Test4()   Dim Dic As Object, i As Long, j As Long, buf As String, k As Long   Set Dic = CreateObject("Scripting.Dictionary")   k = 11   For i = 5 To 9 'E列からI列     For j = 2 To Cells(Rows.Count, i).End(xlUp).Row       buf = Cells(j, i).Value       Dic(buf) = Dic(buf) + 1     Next j     '出力     Cells(2, k).Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Keys)     Cells(2, k + 1).Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Items)     k = k + 2     Dic.RemoveAll   Next i   Set Dic = Nothing End Sub

6338-tm
質問者

お礼

watabe007様 ご回答いただきありがとうございます。 回数をカウントして出力するのはそのままですが、 すこし集計方法が変わりそうなので、このスレッドは解決とさせて頂きたく、お願い致します。 回答No.5の方もよく拝見して勉強させて頂きます。 (多分、別の案件につながると思います。) 色々ご教授頂き本当にありがとうございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

参考に Sub Test()   Dim Dic As Object, c As Range   Set Dic = CreateObject("Scripting.Dictionary")   For Each c In Range("E2", Cells(Rows.Count, "E").End(xlUp))     Dic(c.Value) = Dic(c.Value) + 1   Next   '出力   Range("K2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Keys)   Range("L2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Items)   Set Dic = Nothing End Sub

6338-tm
質問者

お礼

watabe007様 ありがとうございます。 書いてくださったのを活用させていただくと、 E列からI列まで一括で出来ますか?

  • f272
  • ベストアンサー率46% (8013/17127)
回答No.2

#1です。 ごめんなさい。 Dic.Add buf, buf 'そのセルの値を連想配列に登録する。 は Dic.Add buf, 1 'そのセルの値を連想配列に登録する。 に書き換えるというのが,抜けていました。

6338-tm
質問者

お礼

f272様 出来ました! 大変ありがとうございました。 1日悩んでいたことから、次に進むことが出来ます。 感謝です。 もしお時間がありましたら、 Dic.Add buf, buf  と Dic.Add buf, 1 の違いを教えて頂けないでしょうか? 同じ商品名が出てきたら、+1づつカウントしていく、と思って良いのでしょうか?

6338-tm
質問者

補足

Dic.Add buf, buf  と Dic.Add buf, 1 の違い、 分かりました。 私の思い違いで理解出来てなかった事が、 回答頂いたのをきっかけに理解する事ができました。 ありがとうございました。

  • f272
  • ベストアンサー率46% (8013/17127)
回答No.1

Dic.Add buf, buf 'そのセルの値を連想配列に登録する。 の下に Else Dic(buf) = Dic(buf) + 1 を追加して,書き出しの Cells(i + 2, 11) = Keys(i) 'K2から下にリスト作成 の下に Cells(i + 2, 12) = Dic(Keys(i)) を追加すればどうかな?

6338-tm
質問者

補足

f272様 ご回答いただきありがとうございます。 Dic(buf) = Dic(buf) + 1 のことろで、 エラーコード 13 の 型が一致しませんになってしまいました。

関連するQ&A

  • 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 勝手申しますが、お礼は来週月曜日なります。 どうかお許し願います。

  • 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

  • 以下のデータがあり、これを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

  • 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ケタの祝日のセルをグレー&赤文字にならず、他の原因のような気もします... -- どなたかご教示頂けましたら有難いです。 よろしくお願い致します。

  • 重複データの集約を繰り返す方法について

    エクセルのVBAで質問です。 複数シートのB行に重複したデータがあります。 (複数シートともデータ数は違いますが同じデータがあります) この重複したーデータを集約しA行に横に出力する為下記のマクロを組みました。 '集約する Dim Dic, i As Long, buf As String, Keys Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next Do Until Cells(i, 2).Value = "" buf = Cells(i, 3).Value Dic.Add buf, buf i = i + 1 Loop '出力 Keys = Dic.Keys For i = 0 To Dic.Count - 1 Cells(1, i + 5) = Keys(i) Next i Set Dic = Nothing これで集約はできたのですが、他のシートも連続して同じ集約作業をさせたいと思っています。 しかし、くり返し作業をさせると1枚目のシートは集約できますが2枚目以降のシートが同じように集約できません。 適切なくり返しができる構文をご教示いただきたくお願い致します。

  • VBAの配列について

    初めまして、VBAの配列の入力方法について質問させてください。 大量のデータの処理を高速化するため、配列を使用して以下のVBAを入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • エクセルVBAからNotesでメール送信

    一度、知恵袋で質問しましたが、回答に対して聞くことができないので、こちらで質問させて頂きます。 VBAでNotesからメールを送信する際、宛先に複数のアドレスを配列変数で指定すると、 2人目以降にメールが送信されません。 コードの内容はエクセルシートにあるアドレスリストのA列を順に配列にし、 重複しているアドレスを省いて配列変数(adrsarray)を作成し 配列変数に入っている複数の宛先へ、Notesからメールを送信するというものです。 以下、抜粋ですがコードを記します。 Const EMBED_ATTACHMENT As Integer = 1454 Dim nss As Object ' lotus.NOTESSESSION Dim ndb As Object ' lotus.NOTESDATABASE Dim ndoc As Object ' lotus.NOTESDOCUMENT Dim rtitem As Object ' lotus.NOTESRICHTEXTITEM Dim nemb As Object ' lotus.NOTESEMBEDDEDOBJECT Dim fname As String Dim r, lastr, i As Long Dim tmp Dim adrsarray, myarray, mydic, myitm, adrs As Variant 'A列のアドレスを配列変数adrsarrayに代入 For r = 2 To lastr If Cells(r, 1) <> "" Then If r = 2 Then adrsarray = Cells(r, 1) End If If r > 2 Then adrsarray = adrsarray & "," & Cells(r, 1) End If End If Next Set Dic = CreateObject("Scripting.Dictionary") myarray = Split(adrsarray, ",") For i = 0 To UBound(myarray) If Not Dic.Exists(myarray(i)) Then Dic.Add myarray(i), myarray(i) End If Next i '(1)データの重複した配列を初期化し(2)で再度重複無しの配列を格納 adrsarray = "" '(2)重複を除いて配列を作成 myitm = Dic.keys For i = 0 To UBound(myitm) If adrsarray = "" Then adrsarray = myitm(i) Else adrsarray = adrsarray & "," & myitm(i) End If Next Set Dic = Nothing Set nss = CreateObject("Notes.NotesSession") Set ndb = nss.GETDATABASE("", "") ndb.OpenMail Set ndoc = ndb.CREATEDOCUMENT() ndoc.Subject = "データを送ります。" ndoc.SendTo =Array(adrsarray) ↑ ここで以下のように複数名のアドレスを指定すると ndoc.SendTo = Array("○○@○○.com","○○@○○.com","○○@○○.com") 一斉送信できることがわかったのですが、 宛先は固定ではない為、Array(adrsarray)のように 取得した複数アドレスを入れたいのですが 私の作成したコードではうまく動作しません。 長々と申し訳ないですが ndoc.SendTo =array(adrsarray) で送信するにはどうすればよろしいでしょうか。 ご教授よろしく御願い申し上げます。

  • [VBA] 連想配列について

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windowsXP SP3 Office=Excel2003(11.8347.8403) SP3 データ量が多いのでVLOOKUPの処理を連想配列を使ってやりたいのですが、できなくて困っています。 言葉では説明しずらいので、やりたいことのコードを提示します。 :Sheet2 品名  1月  2月 りんご 2   3 ばなな 4   5 下記、VBAコード ---------------------------------------------------- Option Explicit Sub test()  Dim oDict As Object  Dim Ary As Variant  Dim EndRow As Long  Dim i As Long  Ary = Sheets("Sheet2").Range("A2:C3").Value  Set oDict = CreateObject("Scripting.Dictionary")  For i = 1 To UBound(Ary)   oDict(Ary(i, 1)) = Ary(i, 2)   oDict(Ary(i, 2)) = Ary(i, 3)  Next i  With ThisWorkbook.Sheets("Sheet1")   EndRow = .Cells(Rows.Count, 1).End(xlUp).Row   Ary = .Range("A1:Y" & EndRow).Value   For i = 2 To EndRow    Ary(i, 24) = oDict(Ary(i, 1))    Ary(i, 25) = oDict(Ary(i, 2))   Next i   .Range("A1:Y" & EndRow) = Ary  End With  MsgBox "done" End Sub ---------------------------------------------------- というコードなのですが、  For i = 1 To UBound(Ary)   oDict(Ary(i, 1)) = Ary(i, 2)   oDict(Ary(i, 2)) = Ary(i, 3)  Next i が、oDict(Ary(i, 1)) = Ary(i, 2)だけ配列に格納される状態です。 指定の文字列(Key)に対応するItemを返すのが連想配列だと思うのですが、上記コードで、 oDict(Ary(1, 1))=2 oDict(Ary(2, 1))=4 oDict(Ary(1, 2))=3 oDict(Ary(2, 2))=5 という配列に格納されない理由がわかりません。 Scripting.Dictionaryで辞書に格納できるデータになにかしらの制限があるのでしょうか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • エクセルVBAプログラム質問 リストボックス応用

    エクセルVBAプログラムについて質問です。 リストボックスから結果をリストボックスに表示させる リストボックスを応用した内容です。 (1)今回追加したいのは、チェックボックスにチェックすることで、 期限が今月中に切れるもののみをリストボックスに表示させたいです。 (2)期限更新ボタンを押したら、3カ月プラスして延長させたいです。 期限更新したら、リストボックスの中身も更新したいです。 例(1):今日の日付 2018/9/23だとしたら、期限切れる(9月分すべて)を表示させたい。 例(2):期限(変更前)『2018/9/23』から期限(変更後)『2018/12/23』に変更 下記のプログラムで追加していきたいです。 Dim myData Private Sub UserForm_Initialize() Dim Dic, Keys, buf As String, i As Long Me.ComboBox1.Style = fmStyleDropDownList Me.ListBox1.ColumnCount = 4 Me.ListBox1.ListStyle = fmListStyleOption Me.ListBox1.MultiSelect = fmMultiSelectMulti Me.CommandButton1.Caption = "印刷" Me.CommandButton1.Enabled = False With Worksheets("DATA") myData = .Range("A1:E" & .Cells(.Rows.Count, 1).End(xlUp).Row) End With Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 2 To UBound(myData, 1) buf = myData(i, 1) Dic.Add buf, buf Next i Keys = Dic.Keys For i = 0 To Dic.Count - 1 Me.ComboBox1.AddItem Keys(i) Next i Set Dic = Nothing End Sub Private Sub ComboBox1_Change() Dim i As Long, j As Integer With Me.ListBox1 .Clear For i = 2 To UBound(myData, 1) If Me.ComboBox1.Value = myData(i, 1) Then .AddItem "" For j = 2 To 5 .List(.ListCount - 1, j - 2) = myData(i, j) Next j End If Next i End With End Sub Private Sub ListBox1_Change() Dim i As Long, cnt As Long With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then cnt = cnt + 1 End If Next i End With Me.CommandButton1.Enabled = (1 <= cnt And cnt <= 2) End Sub Private Sub CommandButton1_Click() Dim ws As Worksheet, i As Long, j As Integer, cnt As Byte Set ws = Worksheets("印刷") ws.PageSetup.PrintArea = "$I$2:$P$5" ws.Range("J2:L5,N2:P5").ClearContents With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then ws.Range("J2").Offset(0, cnt).Value = Me.ComboBox1.Value For j = 0 To 2 ws.Range("J5").Offset(j * -1, cnt).Value = .List(i, j) Next j cnt = cnt + 2 End If Next i End With Unload Me ws.PrintPreview End Sub

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

専門家に質問してみよう