VBAの記述方法について

このQ&Aのポイント
  • VBAの記述方法について質問をさせてください。
  • 「テスト資料」と「Sheet1」がそれぞれ別ブックで氏名と施設名の情報をもっています。「テスト資料」では、氏名及び施設名が行ごとに並んでおり、氏名はC列、施設名はL列から最終列(そのときによって変動)にあります。「Sheet1」では、氏名はG列、施設名はE列にあります。「テスト資料」の氏名及び施設名がSheet1の氏名及び施設名に一致する行を探しだし、値がどちらも同じなら、「テスト資料」の該当する行のA列からD列と、一致した施設名のセルを22番の色で塗りつぶす(上のVBAでは記述方法が分からなかったため、ひとまずA列からD列を指定しています)という処理がしたいのですが、下記を実行しても何も起こりません。
  • どのようにすれば処理ができるのか、どなたかご助力お願いいたします。
回答を見る
  • ベストアンサー

VBAの記述方法について

初めまして、VBAについて質問をさせてください。 「テスト資料」と「Sheet1」がそれぞれ別ブックで氏名と施設名の情報をもっています。 「テスト資料」では、氏名及び施設名が行ごとに並んでおり、氏名はC列、施設名はL列から最終列(そのときによって変動)にあります。「Sheet1」では、氏名はG列、施設名はE列にあります。 「テスト資料」の氏名及び施設名がSheet1の氏名及び施設名に一致する行を 探しだし、値がどちらも同じなら、「テスト資料」の該当する行のA列からD列と、 一致した施設名のセルを22番の色で塗りつぶす (上のVBAでは記述方法が分からなかったため、ひとまずA列からD列を指定しています) という処理がしたいのですが、下記を実行しても何も起こりません。 どのようにすれば処理ができるのか、どなたかご助力お願いいたします。 Dim i As Integer, j As Integer For i = 3 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Columns.Count, 1).End(xlToLeft).Column If Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells("i,C").Value = Sheets("Sheet1").Range("G:G").Value And Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells("i,j").Value = Sheets("Sheet1").Range("E:E").Value Then Sheets("PQ_Proc_H_EUC_E009_選考会資料").Range("A:D").Interior.ColorIndex = 22 End If Next j Next i

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.4

追記。 >「Range("A" & i & ":D" & i)~」については試したものの、うまくいきませんでした。 If 略 Then Sheets("PQ_Proc_H_EUC_E009_選考会資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 Else Sheets("PQ_Proc_H_EUC_E009_選考会資料").Range("A" & i & ":D" & i).Interior.ColorIndex = xlNone End If で上手く行きませんか? 当方が試した限りでは、上手く動作していますが?

osashi
質問者

お礼

再度ご回答いただいてありがとうございます。マクロの実行ボタンを押すと動くようにはなったのですが、実行中のまま画面が動かなくなってしまいました( ;∀;)しかし最初は全く動きもしなかったので、少し嬉しいです。VBAの記述の方法など、とても勉強になりました。 何度もご迷惑おかけするのも申し訳ないので、もう少し自分でも考えてみようと思います。本当にありがとうございました。

その他の回答 (4)

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

説明が良く解りません。 もう少し具体定期な例を挙げて欲しいです。 こういう事だろうかと推理した図とコードを提示します。 Sub test()   Dim i As Integer, j As Integer, k, sName, sFacility   With Sheets("PQ_Proc_H_EUC_E009_選考会資料")     .Cells.Interior.ColorIndex = xlNone     For i = 3 To .Cells(Rows.Count, "C").End(xlUp).Row   For j = 12 To .Cells(i, Columns.Count).End(xlToLeft).Column         sName = .Cells(i, "C").Value         sFacility = .Cells(i, j).Value         For k = 1 To Sheets("Sheet1").Cells(Rows.Count, "E").End(xlUp).Row           '氏名と施設名が一致しているかチェック           If (sName = Sheets("Sheet1").Cells(k, "G")) * (sFacility = Sheets("Sheet1").Cells(k, "E")) Then             .Range("A" & i & ":D" & i).Interior.ColorIndex = 22             .Cells(i, j).Interior.ColorIndex = 22             Exit For           End If         Next k       Next j     Next i   End With End Sub #「別ブック」とありますが、コードを見て「別シート」の間違いと判断しました。 恐らくあちこちで拾ったコードのツギハギだと思いますし、最初はそれでも良いと思います。 ただ、少なくとも他の回答者の提言の様にステップ実行してのデバッグを行い、どこで何が間違っているのかは確認しましょう。

osashi
質問者

お礼

ご回答いただいてありがとうございます。最初は別ブックだったのですが、こちらで教えていただいてから同じブックで別シートに分ける方法に変更いたしました、説明が分かりづらく申し訳ありません<m(__)m> お二人から回答をいただいていたのですが、最初にご回答いただいたかたと沢山やりとりをさせていただいたので、今回はchie65535さんをベストアンサーとさせていただきます、本当にありがとうございました(^o^)

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.3

以下のように直してみて下さい。 For i = 3 To 略 For j = 12 To 略 For k = 2 To 略 If (略) Then Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i, 1).Interior.ColorIndex = 22 Else Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i, 1).Interior.ColorIndex = xlNone End If Next k Next j Next i 質問者さんのプログラムは For i = 3 To 略 For j = 12 To 略 For k = 2 To 略 (略) Next i  ←For kとFor jのNextが来る前にNext iが来ている Next j Next k という間違いがあって、正常に動きません。 VBAのプログラムを一気に実行しても、ちゃんと動いているか判らないので、プログラムのどこか最初の方でブレークポイントを設定して、プログラムを中断させて、中断した場所から「F8キー」で1行づつ「ステップ実行」させて、思い通りに動いているか、トレース実行しましょう。 一気に動かして「動かない」では、お話になりません。

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.2

追記。 「元々背景色22で塗り潰されていたが、データの中身が変更されて、塗り潰す必要が無くなった行」があった場合「塗り潰さないが、過去に塗り潰された状態のまま残っている」ので、このプログラムは不完全です。 ですので、以下のように「条件に一致したら22で塗り潰し、一致しなかったら塗り潰し無しにする」というプログラムにしないといけません。 また「塗り潰すセル」が「Range("A:D")」だと「AからD列のすべての行」なので「一致した行だけ」にしないといけません。 If ~~(略)~~ Then Sheets("PQ_Proc_H_EUC_E009_選考会資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 Else Sheets("PQ_Proc_H_EUC_E009_選考会資料").Range("A" & i & ":D" & i).Interior.ColorIndex = xlNone End If あと If Sheets("略").Cells("i,C").Value = Sheets("略").Range("G:G").Value Then のような「1つのセルと、複数のセルの比較」は出来ません。「実行時エラー13。型が一致しません」のエラーになります。 ですので For i = 3 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Columns.Count, 1).End(xlToLeft).Column For k = 1 To Workbooks("別のブック.XLS").Sheets("Sheet1").Cells(Workbooks("別のブック.XLS").Sheets("Sheet1").Rows.Count, 1).End(xlUp).Row のように、ループを三重にして If Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i,3).Value = Workbooks("別のブック.XLS").Sheets("Sheet1").Cells(k,7).Value And Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i , j).Value = Workbooks("別のブック.XLS").Sheets("Sheet1").Cells(k , 5).Value Then のように「1つのセルと、1つのセル」を比較しないといけません。 また「Cellsプロパティ」は「Cells( i , 7 )」のように「行番号の数値」と「列番号の数値」を引数にするので「Cells("i,7")」のように文字列を指定してはいけません。 >実行しても何も起こりません。 たぶん「エラーが起きたらプログラムを終了して何もしない」と言う処理になっています。 VBAのどこかに On Error Goto xxxxx のような行があれば、これが「エラーが起きたらプログラムを終了して何もしない」と言う命令なので 'On Error Goto xxxxx On Error Goto 0 のように「エラーが起きたらエラーを表示して止まる」ように変えて下さい(完成時に元に戻せるように、元の行をコメントとして残しておきましょう) 「エラーが起きたらプログラムを終了する」のままでは、間違いがあっても「何も実行しないで終わってしまう」ので、間違いが発見できません。

osashi
質問者

補足

早速ご回答いただいてありがとうございます。教えていただいたことを参考に下記のとおり修正いたしました。 ・Cellsの記述を修正 ・ループを三重にする ・別々のブックにあったデータを1つのブックの別シートに分ける しかし、「Nextで指定された変数の参照が不正です。」と表示されうまくいきませんでした。 また、「エラーが起きたらエラーを表示して止まる」と、「Range("A" & i & ":D" & i)~」については試したものの、うまくいきませんでした。 「":D"」のあたりの式が誤っていると表示されます。 引き続き可能であればご教示いただけると助かります、どうぞよろしくお願いいたします。 Dim i As Integer, j As Integer, k As Integer For i = 3 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Columns.Count, 1).End(xlToLeft).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i, 3).Value = Sheets("Sheet1").Cells(k, 7).Value And Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i, j).Value = Sheets("Sheet1").Cells(k, 5).Value Then Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(i, 1).Interior.ColorIndex = 22 End If Next i Next j Next k

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.1

>「テスト資料」と「Sheet1」がそれぞれ別ブック 以下のIF文は If Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells("i,C").Value = Sheets("Sheet1").Range("G:G").Value And Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells("i,j").Value = Sheets("Sheet1").Range("E:E").Value Then 「現在のワークブックの『PQ_Proc_H_EUC_E009_選考会資料』シート」と「現在のワークブックの『Sheet1』シート」を比較しています。 質問文には『「テスト資料」と「Sheet1」がそれぞれ別ブック』と書かれているので、このVBAは、目的を果たせません。 以下のVBAを「テスト資料.XLS」ブックに記録して、「別のブック.XLS」ブックのSheet1シートにデータを入力して「別のブック.XLS」に保存して、実行してみて下さい。 Dim i As Integer, j As Integer '別のブックを開く Workbooks.Open "別のブック.XLS" For i = 3 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells(Columns.Count, 1).End(xlToLeft).Column If Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells("i,C").Value = Workbooks("別のブック.XLS").Sheets("Sheet1").Range("G:G").Value And Sheets("PQ_Proc_H_EUC_E009_選考会資料").Cells("i,j").Value = Workbooks("別のブック.XLS").Sheets("Sheet1").Range("E:E").Value Then Sheets("PQ_Proc_H_EUC_E009_選考会資料").Range("A:D").Interior.ColorIndex = 22 End If Next j Next i '別のブックを閉じる Workbooks("別のブック.XLS").Close

関連するQ&A

  • vbaプログラミング

    excelのsheet1のF列とj列には5桁の文字列がはいっていて、それぞれ1文字目から3文字目の3文字分を判定して、値をsheet3に出力しています。下記がプログラムです。6しか出力されないんです。 間違い、ご指摘点があればよろしくお願いします。 For i = 3 To 100 If CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "089" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 0 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "090" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 3 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "093" Then Sheets("Sheet3").Cells(j, 2).Value =6

  • 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 記述をスマートにしたい

    お世話になります。 以下の記述をもっと簡略化させたいのですが、 列とシートが違うだけで、同じ処理を2回しているだけなので、 出来そうで、自分では出来ませんでした。 どなたかご教示頂きたく宜しくお願い致します。       記 Set myrngv = Workbooks("A.xls").Sheets("sheet1").Range("a:a") Set myrngYK = Workbooks("A.xls").Sheets("sheet1").Range("t:t") Set myrialz = Workbooks("A.xls").Sheets("sheet2").Range("b:b") Set myXBrialz = Workbooks("A.xls").Sheets("sheet3").Range("b:b") j = 3 Do j = j + 1 myhin = myrngv.Cells(j, 1).Value If myhin = "" Then Exit Do Set c = myrialz.Find(what:=myhin, Lookat:=xlWhole) If Not c Is Nothing Then firstaddress = c.Address Do myrow = c.Row myrngv.Cells(j, 9) = myrialz.Cells(myrow, 7).Value myrngv.Cells(j, 11) = myrialz.Cells(myrow, 8).Value myrngv.Cells(j, 13) = myrialz.Cells(myrow, 3).Value myrngv.Cells(j, 5) = myrialz.Cells(myrow, 3).Value + Cells(myrow, 7).Value - Cells(myrow, 8).Value Set c = myrialz.FindNext(c) Loop Until firstaddress = c.Address End If Loop 'ここより下が同じ様な処理 j = 3 Do j = j + 1 myhin = myrngYK.Cells(j, 1).Value If myhin = "" Then Exit Do Set c = myXBrialz.Find(what:=myhin, Lookat:=xlWhole) If Not c Is Nothing Then firstaddress = c.Address Do myrow = c.Row myrngYK.Cells(j, 8) = myXBrialz.Cells(myrow, 7).Value myrngYK.Cells(j, 10) = myXBrialz.Cells(myrow, 8).Value myrngYK.Cells(j, 12) = myXBrialz.Cells(myrow, 3).Value myrngYK.Cells(j, 6) = myXBrialz.Cells(myrow, 3).Value + Cells(myrow, 7).Value - Cells(myrow, 8).Value Set c = myXBrialz.FindNext(c) Loop Until firstaddress = c.Address End If Loop

  • Excel VBAについて

    Excel VBAについて教えて頂きたいのですが、 Sub test() Dim lastrow, r, i As Long Dim sh1, sh2 As String Dim ws As Worksheet lastrow = Cells(Rows.count, "D").End(xlUp).row For r = 7 To lastrow '7 For i = 1 To lastrow '4 sh1 = ActiveSheet.Cells(r, 4) ActiveSheet.Cells(r, 20) = _ Application.CountIfs(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3")) ActiveSheet.Cells(r, 21) = _ Application.CountIfs(Sheets(sh1).Range("C:C"), Range("F3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("C:C"), Range("F3")) ActiveSheet.Cells(r, 22) = _ Application.CountIfs(Sheets(sh1).Range("E:E"), Range("K3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("E:E"), Range("K3")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") ActiveSheet.Cells(r, 15) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") - 200 ActiveSheet.Cells(r, 18) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") + 200 ActiveSheet.Cells(r, 19) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) For Each ws In Worksheets ws.AutoFilterMode = False Next Next Next End Sub このコードは ActiveSheetで実行すると D列の7行目から最終行までに入力されている名前のシート(名前=シートがあります) その、シートの参照先で C,D,E列がcountif関数を利用して O列がSubtotal関数を利用しています。 このコードでもやりやいことは実行できるのですが、 時間がかかりすぎてしまいます。 約20件あり約2分ほどかかります。パソコンによっては倍ほど時間がかかるかもです。 そこでなのですが、 もっと処理のスピードを上げたいのですが、 可能でしょうか? 可能ならそのやり方をご教示ください。 よろしくお願い致します。

  • VBAのCopyコマンドについて

    エクセルVBAでシート3のRangeの値をからシート2のRangeへデータをコピーしようとしているのですが Sheets(3).Range("B3:B100").Copy _ Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) がうまくいって、 Sheets(3).Range(Cells(2, col1), Cells(100, col1)).Copy _ sheets(2).Range(Cells(2, col2), Cells(100, col2)) が何故、オブジェクト定義エラーになってしまうのがわかりません。 col1、col2は列の変数です。 よろしくお願いします。

  • エクセルVBAについて教えてください。

    DSUMを使ってVBAで自動計算をさせたいのですがうまくいきません。  ・Sheetsデータにデータを置いていて、A1からU1610までデータが入ってます。  ・Sheets集計用は計算させるための(条件を入れる)シートで、A1からE列まで(選択する項目によって何行目になるかわかりません。)  ・mycountでE列のデータが入ってる行を出してます。  ・部屋タイプで1K~1LDKを選ぶとDSUMの式のタイプに1を入れたいのです。(1K~1LDKの場合はCells(1,3) 下記のように書いてみましたが上手くいきません。 どなたかご教授いただけると助かります。 mycount = "=COUNT(集計用!E2:E300)" Sheets("集計用").Cells(5, 7).Value = Range("g10") = " =DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" '部屋タイプの選択 If Sheets("フォーム").Range("c30") = "1K~1LDK" then  タイプ = 3 ElseIf Sheets("フォーム").Range("c30") = "2K~2LDK" Then タイプ = 6 ElseIf Sheets("フォーム").Range("c30") = "3K~3LDK" Then  タイプ = 9 ElseIf Sheets("フォーム").Range("c30") = "4K~4LDK" Then タイプ = 12 Else Sheets("フォーム").Range("c30") = "その他" Then タイプ = 15 End If

  • VLOOKUP関数と同じことをVBAでおこなうには

     初めまして、当方VBAの素人です。よろしくお願いします。  同じような質問で、このようなVBAを見つけました。 Sub Macro1() For n = 2 To 5 '処理するSheet2の行数範囲 a = Sheets("Sheet2").Cells(n, 1) 'aにA列の値を代入 For m = 2 To 5 '検索するSheet1の行数範囲 If Sheets("Sheet1").Cells(m, 1) = a Then 'Sheet2のA列の値とSheet1のA列が一致した場合 v = Sheets("Sheet1").Cells(m, 2) 'vにB列の値を代入 Sheets("Sheet2").Cells(n, 2).Value = v 'Sheet2のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub このVBAではSheet2での検索、入力が列になるのですが、列でなく、行でできないでしょうか。できればSheet1のB列の値をSheet2の1行で検索、Sheet2の2行に入力されるだけではなく、Sheet1のC列の値をSheet3の1行で検索、Sheet3の2行に入力されるようにしたいと思います。  解る方、よろしくお願いします。

  • EXCEL2000VBAの記述について

    e列~j列の5行目に 下記の項目が入っています。   e列 f列 g列 h列 i列 j列 5行目 4月 5月 6月 7月 8月 9月 別シートのE列の5行目に入っているデータと、上記の列(e列~j列)の5行目に入っているデータが 同じの場合は、別シートのE列の6行目から38行目に入っているデータをコピーして、上記の 同じ項目の場所の6行目から38行目にデータを貼り付けたい場合 VBAで記述の仕方を教えてください。

  • Excel VBAについて教えて下さい。

    00というブックとテストというブックがあります。 00のデータを並び替え、一部変更し、テストのシート3へ貼付けを行いたいのですが、 うまく作動してくれません。以下に現在のコードを記載しましたので、ご指摘いただければと思います。 やりたいことは 1.ブック”00”のシート00にて条件がF列が0、E列がHでソートをかけます。 2.E列のHをすべて数字の1に変更します。 3.今度は別の条件、F列が1、E列がH、D列が1でソートをかけます。 4.E列のHをすべて消去します。 5.すべて表示させA列からE列までのデータを、テストのシート3へ貼付けをします。 コピー&ペーストは上手くいくのですが、肝心のソート+文字の変更+消去が出来ていません。 ネットを見ながら書いたコードで、VBAを勉強中です。 よろしくお願いします。 あと、この作業の前にブック00のB列にて昇順のソートをかけるというコードを追加したいのですが、 それについても教えていただけるとうれしいです。 よろしくお願い致します。 Private Sub Worksheet_Activate() Dim wb1 As Workbook Dim wb2 As Workbook Dim i As Long Application.ScreenUpdating = False Set wb1 = ActiveWorkbook Set wb2 = Workbooks.Open("C:\Documents and Settings\デスクトップ\メモ\00.xls", ReadOnly:=True) With wb2.Worksheets("00").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=6, Criteria1:="=" & "0", Operator:=xlAnd .AutoFilter Field:=5, Criteria1:="=" & "H", Operator:=xlAnd .AutoFilter x = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To x If Cells(i, 5) = "H" Then Cells(i, 5) = Replace(Cells(i, 5), "H", "1") End If Next i With wb2.Worksheets("00").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=6, Criteria1:="=" & "0", Operator:=xlAnd .AutoFilter Field:=5, Criteria1:="=" & "H", Operator:=xlAnd .AutoFilter Field:=4, Criteria1:="=" & "1", Operator:=xlAnd .AutoFilter x = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To x If Cells(i, 5) = "H" Then Cells(i, 5) = Replace(Cells(i, 5), "H", " ") End If Next i wb2.Sheets("00").Range("B1", .Cells(Rows.Count, 5).End(xlUp)).Copy wb1.Sheets("Sheet3").Range("K3").PasteSpecial wb2.Close False Range("A1").Select Application.ScreenUpdating = True End With End With End Sub

  • Excel VBA 条件を満たすデータのコピーと計算結果の表示

    Excel2003を使用しています。 Sheet1のある選択範囲に対して(都度、手動で選択します) D列-E列が0でなかったら、その行のデータをSheet2のアクティブセル以下にコピーするという処理を下記のマクロでしています。 下記のマクロにコードを追加することによって、条件を満たすデータをコピーする際、D列-E列の計算結果をSheet2のD列に表示させることは可能でしょうか? 例えば、Sheet1のD5セルに100、E5セルに50と数値が入力されていた場合、Sheet2のD7セルに50と計算結果を表示させたいですのですが…。 (貼り付け先の行は、アクティブセルの行です) よろしくお願いします。 -------------------------------------------------- Sub Macro1()  Sheets("Sheet1").Activate '選択範囲のサイズ取得   With Selection    i = .Cells(1).Row    j = .Cells(1).Column    k = .Cells(.Count).Row    l = .Cells(.Count).Column   End With  Sheets("Sheet2").Activate   ActR = ActiveCell.Row   ActC = ActiveCell.Column  With Sheets("Sheet1")   For m = i To k    If .Cells(m, 4) - .Cells(m, 5) <> 0 Then     .Range(.Cells(m, j), .Cells(m, l)).Copy     Sheets("Sheet2").Cells(ActR, ActC).PasteSpecial Paste:=xlPasteAllExceptBorders     ActR = ActR + 1     Application.CutCopyMode = False    End If   Next  End With End Sub