マクロdictionaryオブジェクト書き換え

このQ&Aのポイント
  • マクロdictionaryオブジェクトを使用して、シート1のF列を検索値として、シート2のA列を検索し、ヒットしたらシート2の該当行のD列をシート1のAE列に転記します。
  • シート1が壊れた原因は、正しく書き換えられていなかったためです。正しい記述は、シート1のF列を検索値として、シート2のA列を検索し、ヒットしたらシート2の該当行のD列をシート1のAE列に転記することです。
  • 書き換える部分は、シート1のF列を検索値として、シート2のA列を検索し、ヒットしたらシート2の該当行のD列をシート1のAE列に転記することです。また、無い場合は「無」と転記します。
回答を見る
  • ベストアンサー

マクロdictionaryオブジェクト書き換え

ここで教えていただいたマクロを   シート1のF列を検索値として   シート2のA列を検索しヒットしたら   シート2の該当行のD列をシート1のAE列に転記。   データの2列目から行う。ヒットしない場合は 無 と転記。 と変更したくて記述を書き換えたらシート1が壊れてしまいました。 正しい記述を教えてください。 ↓教えていただいた書き換え前の正常動作する記述↓ Sub 検索() 'dictionaryオブジェクトを使用 'シート1のA列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のE列をシート1のC列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定E列 With .Range("E2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (5)=E列 w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 A列 With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定 Offset(, 2)=検索値のA列より右2つ→C列 With .Offset(, 2) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub ---- ↓書き換えておかしな動きになった物 ●の部分を変更しました↓ Sub 検索02() 'dictionaryオブジェクトを使用 'シート1のF列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のD列をシート1のAE列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定D列● With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (4)=D列● w = .Columns(4).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 F列● With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定  'Offset(, 25)=検索値のA列より右25個→AE列● With .Offset(, 25) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

よく見てませんが 下のほう   With Sheets("Sheet1")     '検索値のある列指定 F列●     With .Range("F2", .Cells(.Rows.Count, "F").End(xlUp))       v = .Value       For i = 1 To UBound(v)         If dic.exists(v(i, 1)) Then           v(i, 1) = w(dic(v(i, 1)), 1)         Else           v(i, 1) = "無"         End If       Next       '転記する列を指定       'Offset(, 25)=検索値のF列より右25個→AE列● としたらどうなりますか? 1を"F"に変えただけですが。

gx9wx
質問者

お礼

'検索値のある列指定 F列●     With .Range("F2", .Cells(.Rows.Count, "F").End(xlUp)) で思ったとうり動きました。 元は1と数字の表記でしたので With .Range("F2", .Cells(.Rows.Count, 6).End(xlUp)) にしても思ったとうり動きました。 Fにしろ6にしろ、なぜここが1ではいけないのか、 わかりません。 また上の方にある With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) は1のままでもいいのでしょうか?

その他の回答 (1)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

おはようございます。 今日も二日酔いのmerlionXXです。 うまくいってよかったですね。 > Fにしろ6にしろ、なぜここが1ではいけないのか、 > わかりません。 検索値のある列はF列なんでしょう? > With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) これでは、AからFまでの6列が対象範囲になります。 その結果、 > v = .Value  で、配列変数vに代入されるのは6列のデータになり、 > With .Offset(, 25) > .ClearContents > .Value = v で、6列分が転記されたのではないですか? > また上の方にある > With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) > は1のままでもいいのでしょうか? ここもAからDを指定しています。 しかし、 > 検索する列指定 (1)=A列 > v = .Columns(1).Value  で、そのなかの最初の1列(A列)のみを配列変数vに代入しています。 だからOKです。 本来は、 With .Range("A2", .Cells(.Rows.Count, "A").End(xlUp)) v = .Value と書くべきなんでしょうね。

gx9wx
質問者

お礼

>で、6列分が転記されたのではないですか? そのとうりです。シート1がめちゃめちゃになりました。 配列変数への代入がまだよくわからないです。 どうもありがとうございました。

関連するQ&A

  • マクロdictionaryオブジェクト書換(続)

    以下のマクロがあります。 BOOK1で(Sub CSV取得)を動作させると 選択したCSVファイルがBOOK2にインポートされて編集作業が行われる。 Sub CSV取得() '選択したCSVファイルをインポートし 'シート名を集計にする。CSVファイルは閉じる。  Call編集集計 End Sub --- Sub 編集集計() 'BOOK2のシート集計の編集作業を行う (途中記述省略) Call 番号変更 (途中記述省略) End Sub --- Sub 番号変更() '実験中。極遅。対策必要。 'BOOK2のシート集計のI列を検索値として 'BOOK1のシート新番号のA列を検索し 'ヒットしたらBOOK1のシート新番号の該当行のE列を 'BOOK2のシート集計のH列に転記する 'ヒットしない場合は 無 と転記する '↑極遅の他にこれ(ヒットしない場合の処理)も '正常動作しないので変更必要 Dim myBk As String myBk = ThisWorkbook.Name With Sheets("集計") .Columns("H:H").NumberFormatLocal = "G/標準" .Range("H1").Formula = _ "=IF(ISNA(VLOOKUP(I1,[" & myBk & "]新番号!$A:$E,5,FALSE)),I1,VLOOKUP(I1,[" & myBk & "]新番号!$A:$E,5,FALSE))" .Range("H1").Copy .Range("H1:H" & .Range("I" & .Rows.Count).End(xlUp).Row) .Columns("H:H").Copy .Range("H1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End With End Sub ----- とりあえずヒットしない場合以外は思ったとうり動いていますが、 ・データが各シート20,000行を超える為3分~5分程度かかる。 ・BOOK2のシート集計のI列とBOOK1のシート新番号のA列での  検索ではデータの性質上、重複データがある事になってしまい  返す値が違う場合が存在してしまいます。 よって高速な処理の以下↓の記述を応用し かつ検索値も3つのセルの連結した値に変更に挑戦しギブアップです。 記述を教えてください。お願いします。 ●やりたい事 BOOK2のシート集計のI,K,L列の順で連結した値を検索値として BOOK1のシート新番号のA,B,C列の順で連結した値を検索し ヒットしたらBOOK1のシート新番号の該当行のE列(セル書式標準半角英数字3ケタ)を BOOK2のシート集計のH列に転記する。 ヒットしない場合は 無 と転記する。 BOOK2のシート集計はA列からO列でデータは1行目から。 BOKK1のシート新番号はA列からE列でデータは2行目から。 VLOOKUPは遅いので以下の記述を応用したい。 ↓↓(応用の為の記載なので今回の希望処理の記述にはなっていません。) ---- Sub 検索02() 'VLOOKUPではなくdictionaryオブジェクトを使用 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("シート1") With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Columns(1).Value w = .Columns(4).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("シート2") With .Range("F2", .Cells(.Rows.Count, 6).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next With .Offset(, 25) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • 6列を配列に取込し1列を検索値、2列を書出ししたい

    シート(抜取マスタ)のA列と シート(マスタ全部)のA列をぶつけてヒットしたら シート(マスタ全部)の該当行のE列を抜取マスタのF列に転記 するマクロを ヒットしたら シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 とか シート(マスタ全部)の該当行のD,F列を抜取マスタのF,G列に転記 シート(マスタ全部)の該当行のE,F列を抜取マスタのF,H列に転記 に改造したいです。 ●部分を修正しなければと思っていますが 思ったように動きません。教えてください。 よろしくお願いします。 Sub 検索貼付() 'シート(抜取マスタ)のA列と 'シート(マスタ全部)のA列をぶつけてヒットしたら 'シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 'データは2列目から開始 'ヒットしない場合は 無し と記入 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("マスタ全部") 'シート(マスタ全部)のデータを配列に取込 '(F2の部分とCount, 1の部分 →A~F列となる) With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) 'Vに代入する事となる、検索する列の指定.Columns(1)=A列 v = .Columns(1).Value 'Wに代入する事となる、書出す値のある列の指定 (5)=E列 ●w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("抜取マスタ") '検索値のある列指定(A2の部分とCount, 1の部分→A列~A列) With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else 'ヒットしない場合 v(i, 1) = "無" End If Next '書き出しする列を指定(Offset(, 5)=検索値のA列より右5つ→F列) ●With .Offset(, 5) .ClearContents .NumberFormat = "@" .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • マクロ ソートをしたいのですが、組み込めますか

    マクロの説明 1.Sub Sample7()はsheet4の列をソートするマクロです。 (単独では、このマクロでソートできる) 2.Sub sample2()はsheet4のソート以外は完成しています。 やりたいこと Sub sample2()の中にsheet4の重複データを削除したもののソートのコードを組み込みたい。 但し、組み込むとしてSub Sample7()のコードでよいのか、初心者なのでよくわかりません。 なお、Sub sample2()のマクロは途中省いています。 Sub Sample7() Sheets("sheet4").Range("A1:A1135").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes End Sub Sub sample2() Dim data As Variant 'データコピー用の使いまわし配列 Dim dic As Object Dim i As Long Set dic = CreateObject("Scripting.Dictionary") 'Sheet4~5のA列をリセット Sheets("Sheet4").Range("A2:A" & Rows.Count).ClearContents Sheets("Sheet5").Range("C3:C" & Rows.Count).ClearContents            ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 'Sheet4に重複していないデータを書き込み With Sheets("Sheet4") .Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(dic.Count).Value = Application.Transpose(dic.keys) 'Sheet4のC列をSheet5にコピー data = .Range("C2:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Value End With Sheets("Sheet5").Range("C3").Resize(UBound(data)).Value = data Set dic = Nothing End Sub

  • QエクセルVBARange3か所に合致する合計額2

    お世話になります。 下記は質問内容の現在の出力マクロです Private Sub CommandButton32_Click() Unload Me Sheets("入力").Select Set dic1 = CreateObject("Scripting.Dictionary") Sheets("入力").Select Set dic2 = CreateObject("Scripting.Dictionary") Sheets("入力").Select Set dic3 = CreateObject("Scripting.Dictionary") v = Sheets("入力").Range("D2").CurrentRegion.Resize(, 12).Value2 For i = 1 To UBound(v) sName = v(i, 10) dic1(sName) = dic1(sName) + v(i, 12) Next v = Sheets("入力").Range("B2").CurrentRegion.Resize(, 12).Value2 For i = 1 To UBound(v) sName = v(i, 2) dic2(sName) = dic2(sName) + v(i, 12) Next v = Sheets("入力").Range("B2").CurrentRegion.Resize(, 12).Value2 For i = 1 To UBound(v) sName = v(i, 4) dic3(sName) = dic3(sName) + v(i, 12) Next Workbooks.Add With Sheets("sheet1").Range("B3").Resize(dic1.Count) .Resize(, 2).Value = Application.Transpose(Array(dic1.Keys(), dic1.Items())) End With With Sheets("sheet2").Range("B3").Resize(dic2.Count) .Resize(, 2).Value = Application.Transpose(Array(dic2.Keys(), dic2.Items())) End With With Sheets("sheet3").Range("B3").Resize(dic3.Count) .Resize(, 2).Value = Application.Transpose(Array(dic3.Keys(), dic3.Items())) End With End Sub 前回質問からCD等もろもろ手抜きで書いたため少し違っています。 伝わるか心配ですが書き込みますので宜しくお願いします。 例、B列の重複した会社名C列の重複した支店加入者名D列の重複した班名そしてG列には重複した変更可能な重複した商品があります。重複したものをまとめてそれぞれに合計を出してBooks.AddのSheet1(現在はSheet1~sheet3に出力)に出力したいのです。その他の列は自動で出るように関数が張り付けてありますが質問には関係ないと思いますので割愛します。 つたない質問で申し訳ありませんがわかる方がありましたら回答をお願いします。 尚、(現在はSheet1~sheet3に出力)これではsheet1~sheet3を行ったり来たりで効率が悪くて困っています。宜しくお願いします

  • dictionaryでの集計

    A------B--------【F】---【G】----(H)-----I------(J)---------(O) 1 名前  住所・・・金額  個数  種別(1)  数値  種別(2)・・・・種別(3) 2 3 4~~~~データ始まり~~~~ 5 6 上図のようなデータがあり、種別(1)・(2)・(3)をKeyにして dictionaryで、F列とG列の合計値を求めたいのですが、 エラーばかりでうまくいきません。 インデックスが有効範囲にありません というエラーがちょこちょこ起こります。 Option Explicit Sub syukei() Dim dic As Object, i As Long, j As Long, n As Integer, data As String, tbl, x Set dic = CreateObject("scripting.dictionary") Application.ScreenUpdating = False With Sheets("Sheet1") tbl = .Range("a4").Resize(.Range("a" & Rows.Count).End(xlUp).Row, 15) ReDim x(1 To UBound(tbl, 1), 1 To 15) For i = 1 To UBound(tbl, 1) If Not IsEmpty(tbl(i, 8)) Then data = tbl(i, 8) & "," & tbl(i, 15) If Not dic.exists(data) Then j = j + 1 For n = 1 To 15 x(j, n) = tbl(i, n) Next n dic(data) = j Else x(dic(data), 6) = x(dic(data), 6) + tbl(i, 6) x(dic(data), 7) = x(dic(data), 7) + tbl(i, 7) End If End If Next i .Range("D134").Resize(, 5) = Split("種別 区分 金額合計 個数合計") .Range("D135").Resize(j, 5) = x End With Set dic = Nothing Application.ScreenUpdating = True End Sub このようなコードを書きましたが data = tbl(i, 8) & "," & tbl(i, 15) のところで、型が一致しませんというエラーになります。 .Range("D134").Resize(, 5)に貼り付けようとしています。 種別(2)をkeyに設定するコードを書いていないのは、 種別(2)は、A・B・C・Xとあり、keyごとで分けるのではなく Xか、それ以外かに分けたいので悩んでいます。 いつも頼ってばっかりで申し訳ありませんが、教えてください。 お願いします。

  • EXCELマクロの処理時間を短縮したい

    EXCELマクロの時間短縮で悩んでいます。どうかお知恵をお貸し下さい。(長文です) Windows XP Pro EXCEL 2002 を使用しています。 以下の作業の2.のところで2分以上 3.のところで2分以上の時間が掛かっています マクロソースによるこれ以上の短縮は望めないでしょうか?  <作業内容> 1. OLEDBを使って他のDBから  トランザクション「A」のデータを シート「A」に  マスタ「M」のデータを シート「M」に展開しています 2. シート「A」のデータは 約40,000件 (変動します)  番号    基本番号+枝番(1桁) 最初は基本番号+0で変更があると枝番をカウントアップして追加  最新番号  変更が合った場合 変更の回数(枝番=0のレコードだけ更新)  コード   名称コード   数量    単価    小数点以下 2桁まで  追加数量    追加単価   番号  |最新番号|コード| 数量 | 単価 | 追加数量|追加単価|   1000010 | 0 |123456| 1,000|100.30| 10|1,000.00|   1000020 | 2 |111111| 1,000|200.50| 1|5,000.00|   1000021 | 0 |111111| 900|200.50| 2|5,000.00|   1000022 | 0 |111111| 1,000|200.00| 1|5,000.00|   1000030 | 0 |123000| 2,500| 90.75| 0| 0.00|   9500010 | 0 |999999| 0| 0.00| 0| 0.00|  これを シート「一覧」に基本番号別に枝番が最新の行をコピーして金額を出します  約 35,000件になります  基本番号 |コード| 名称 | 数量 | 単価 | 追加数量|追加単価| 金額   100001 |123456| | 1,000|100.30| 10|1,000.00|110,300   100002 |111111| | 1,000|200.00| 1|5,000.00|205,000   100003 |123000| | 2,500| 90.75| 0| 0.00|226,875 3. シート「M」のデータは 約30,000件 (変動します)   コード |  名称  |    111111| AAAAAAAAAA | 123000| ABCDEFGHIJ | 123456| BBBBBBBBBB |  シート「一覧」の名称に名称を入れます  基本番号 |コード|  名称 | 数量 | 単価 | 追加数量|追加単価| 金額   100001 |123456|BBBBBBBBBB| 1,000|100.30| 10|1,000.00|110,300   100002 |111111|AAAAAAAAAA| 1,000|200.00| 1|5,000.00|205,000   100003 |123000|ABCDEFGHIJ| 2,500| 90.75| 0| 0.00|226,875 <マクロ ソース> Sub 一覧作成() Dim i As Long, j As Long, k As Long, read_no As Long Dim jlist As Worksheet, jdata As Worksheet Dim v As Variant, w As Variant Dim dic As Object Application.ScreenUpdating = False '画面停止 'DB取り込み ※省略 Set jlist = Worksheets("一覧") '処理2 Set jdata = Worksheets("A") jlist.Cells.ClearContents jlist.Range("A1").Value = "基本番号" jlist.Range("B1").Value = "コード" jlist.Range("C1").Value = "名称" jlist.Range("D1").Value = "数量" jlist.Range("E1").Value = "単価" jlist.Range("F1").Value = "追加数量" jlist.Range("G1").Value = "追加単価" jlist.Range("H1").Value = "金額" i = 2 '今読んでる行 k = 2 '書いている行 j = 0 '枝番が合った場合 飛ばす行 read_no = 0 Do While jdata.Cells(i, 1).Value < 9500000 read_no = jdata.Cells(i, 1).Value / 10 j = 0 If jdata.Cells(i, 2).Value <> 0 Then '枝番有 j = judata.Cells(i, 2) End If i = i + j jlist.Cells(k, 1).Value = Format(read_no, "000000") jlist.Cells(k, 2).Value = jdata.Cells(i, 3).Value jlist.Cells(k, 4).Value = jdata.Cells(i, 4).Value jlist.Cells(k, 5).Value = jdata.Cells(i, 5).Value jlist.Cells(k, 6).Value = jdata.Cells(i, 6).Value jlist.Cells(k, 7).Value = jdata.Cells(i, 7).Value jlist.Cells(k, 8).Value = _ Application.RoundDown((jdata.Cells(i, 4).Value * jdata.Cells(i, 5).Value + _ jdata.Cells(i, 6).Value * jdata.Cells(i, 7).Value), 0) k = k + 1 i = i + 1 Loop Set jname = Worksheets("M") '処理3 With jname With .Range("B2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Columns(1).Value w = .Columns(2).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With jlist With .Range("B2", .Cells(Rows.Count, 4).End(xlUp)) 'B2~Dの最終行まで v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 2) = w(dic(v(i, 1)), 1) Else v(i, 2) = "無" End If Next With .Offset(0, 0) .ClearContents .Value = v End With End With End With Set dic = Nothing Set jlist = Nothing Set jname = Nothing Application.ScreenUpdating = True End Sub

  • 配列に格納したデータを指定行以下に転記する方法

    excel2000を使っています。 以下のコードだと最終行にデータが転記されます。これを4行目に確定して、転記したいのです。常に4行目つまりA列4行目以下に上書きしたいのです。 その場合コードをどのように変更すべきでしょうか? Sub 配列() With ActiveSheet ' 配列に格納 --------------------------- Dim i As Integer Dim LastRow As Long Dim SaleAry As Variant ' 配列に格納 --------------------------- SaleAry = Array(.Range("t4"), .Range("e5"), .Range("g5"), .Range("o5")) End With ' 転記 --------------------------- With Worksheets("daityou") LastRow = .Range("A65536").End(xlUp).Row For i = 0 To UBound(SaleAry) .Cells(LastRow + 1, i + 1).Value = SaleAry(i) ' Next i End With Set SaleAry = Nothing End Sub

  • マクロでCOUNTIFを使いたい

    マクロでCOUNTIFを使いたい COUNTIFを使いたく、下記のマクロを作成しました。 【転記元】A列の値が【転記先】A列には何回出てくるのか?を転記先C列に書き出す作業を したいのですが、提示したコードだと、★のC列全てに「1」が入ってしまいます。 ところが、★★の部分を下記のように書き替えると、正常にカウントされた値が入ります。 ent.Cells(i + 1, "C").Formula = Application.WorksheetFunction.CountIf(mst.Range("A2:A100"), ent.Cells(i + 1, "A")) なぜこうなるのか?原因が知りたくて頭を悩ませております。 お解りの方がいらっしゃればどうぞご指摘ください。 宜しくお願い致します。 ------------------------------------------------------------ 【転記元のシート】  A列  10    10  20  20  50 【転記先のシート】  A列  B列  C列 ←★このC列に結果を表示させたい  10      2  20      2  50      1 ------------------------------------------------------------ Sub カウントテスト() Dim ent As Worksheet, mst As Worksheet Dim i As Integer Dim lstcel As String Dim mstrange As Range Dim sach As Variant Set ent = Workbooks("転記先").ActiveSheet Set mst = Workbooks("転記元").ActiveSheet Set mstrange = mst.Range("A2:A100") i = 1 lstcel = mst.Cells(Rows.Count, "A").End(xlUp).Row sach = ent.Cells(i + 1, "A") For i = 1 To lstcel If mst.Cells(i + 1, "A") <> "" Then '↓★★ここの部分を書き替えるときちんとカウントされる ent.Cells(i + 1, "C").Formula = Application.WorksheetFunction.CountIf(mstrange, sach) End If Next i End Sub

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

  • VBA【dictionary勉強中ですが・・・】集計マクロ

    いつもお世話になっております。 現在dictionary勉強中ですが、なかなかコツをつかめず 思ったとおりのマクロを作成することができません(ノ_;) ところで、今回作成しているのは 元データ.xlsというファイルのシート(データ)に   |【A】| B | C |【D】| E | F |・・・|H|I|【J】|K 3  【顧客ID】|顧客|受付日|【担当】|・・・|【会場名】|(見出し) 4  データの始まり↓ と、ありまして、 集計データ.xlsのシート(集計)に  | A | B | C | D | E | F | 1 顧客ID|担当|会場名| と二行目から一覧表があります。 A列のIDが一致するものに Sheet(データ)  →  Sheet(集計)  セル( i, "D")の値 → セル( j, "B") に セル( i, "J")の値 → セル( j, "C")に     セル(j,"C")に値が入っているとき、セル(j,"D")に→Fまで(4回のみ) A列のIDが一致するものがない時 セル( i, "A")の値 → セル( 最終,"A")に  セル( i, "D")の値 → セル( 最終, "B") に セル( i, "J")の値 → セル( 最終,"C")に追加 というように、入れたいのですが、 以下のようなコードをネットで見つけ自分なりに考えて変更を加えてみましたが あまり分かっていないためどのように変更すればいいのかよく分かりません。どなたかご教授ください。お願いします。 Sub Try() Dim data_1() As String Dim data As Long Dim maxrow As Long Dim t As Integer, f As Integer, y As Integer Set ws1 = Worksheets("集計") Set ws2 = Worksheets("データ") Application.ScreenUpdating = False maxrow = ws2.Range("a65536").End(xlUp).Row With ws1 For i = 2 To Range("a65536").End(xlUp).Row data = .Cells(i, 1) f = 0 t = 0 With ws2 t = Application.WorksheetFunction.CountIf(.Range("a4:a" & maxrow), data) If t > 0 Then For n = 1 To maxrow ReDim Preserve data_1(f) If data = .Cells(n, 1) Then data_1(f) = .Cells(n, 10) f = f + 1 If t = f Then Exit For Else 'A列にIDが存在しなければ追加する:ここの記述がよく分かりません。 data_1(f) = .Cells(n, 1) End If Next n For y = 0 To UBound(data_1) ws1.Cells(i, maxcol(i)) = data_1(y) Next y End If End With Next i End With Application.ScreenUpdating = True End Sub '-------------------------- Private Function maxcol(ByVal i As Long) As Integer Dim j As Integer With Worksheets("集計") j = 4 Do While .Cells(i, j) <> "" j = j + 1 Loop maxcol = j End With End Function

専門家に質問してみよう