- ベストアンサー
VB初心者のためのブック参照作業方法
- VB初心者の方が、二つのブックを同時に開き、指定の文字を含む行を参照していく作業方法について教えてください。
- 質問者は、Webで検索しても詳細な情報を見つけることができず、質問をすることにしました。
- ブック1の1列目を参照し、指定の文字が含まれる行があれば、その行からブック2にコピペしていく方法を知りたいです。お力添えいただける方がいらっしゃいましたら、よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#2、#4です。 同様のいくつかの事例をあげておきます。 http://oshiete1.watch.impress.co.jp/qa6439871.html http://oshiete1.watch.impress.co.jp/qa6447162.html これで少しプログラムの中で何をしているか、 あるいは応用などが分かると思います。 考えていくと、ループの渦の中に巻き込まれて 出口がわからなくなるものです。特に 多重ループの場合は、途中で条件を挟まなければ ならない場合は、めまいをを起こしそうになります。 こうした、多重ループの扱いは慣れもありますが、 データの流れを If wk1.Sheets("sheet1").Cells(1, 1).Value = "指定" Then wk2.Sheets("sheet1").Cells(1, 1) = wk1.Sheets("sheet1").Cells(1, 1).Value wk2.Sheets("sheet1").Cells(1, 2) = wk1.Sheets("sheet1").Cells(1, 2).Value wk2.Sheets("sheet1").Cells(1, 3) = wk1.Sheets("sheet1").Cells(1, 3).Value wk2.Sheets("sheet1").Cells(1, 4) = wk1.Sheets("sheet1").Cells(1, 4).Value wk2.Sheets("sheet1").Cells(1, 5) = wk1.Sheets("sheet1").Cells(1, 5).Value wk2.Sheets("sheet1").Cells(1, 6) = wk1.Sheets("sheet1").Cells(1, 6).Value End If If wk1.Sheets("sheet1").Cells(3, 1).Value = "指定" Then wk2.Sheets("sheet1").Cells(3, 1) = wk1.Sheets("sheet1").Cells(3, 1).Value wk2.Sheets("sheet1").Cells(3, 2) = wk1.Sheets("sheet1").Cells(3, 2).Value wk2.Sheets("sheet1").Cells(3, 3) = wk1.Sheets("sheet1").Cells(3, 3).Value wk2.Sheets("sheet1").Cells(3, 4) = wk1.Sheets("sheet1").Cells(3, 4).Value wk2.Sheets("sheet1").Cells(3, 5) = wk1.Sheets("sheet1").Cells(3, 5).Value wk2.Sheets("sheet1").Cells(3, 6) = wk1.Sheets("sheet1").Cells(3, 6).Value End If のように、変数を入れずにデータを入れてみると よくわかります。
その他の回答 (5)
- layy
- ベストアンサー率23% (292/1222)
「いまいちよくわからなかった」 この解き方を習得し、理解しておかないと、 下手すると、いつまでたっても「わからない」に陥ります。 いつでもサンプルを作ってくれる人がいる、わけでもないので、 がんばりましょう。 いろいろ質問できるのも今のうちです。 下記、よく使うところです。この類のページを探しておくこと。 http://www.asahi-net.or.jp/~zn3y-ngi/ http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html
お礼
お返事遅くなってしまい申し訳ありません。 貼り付けて頂いたページ等をこれからは参考にしながらがんばってみます。 貴重なご指摘ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
#2です。変数の初期値と変数を変更しておきます。 Sub test5() Dim L1 As Long Dim R1 As Long Dim R2 As Long Dim x As Long Dim y As Long Dim wk1 As Workbook Dim wk2 As Workbook Dim strPath As String '変数の初期化 R2 = 0 'パスの設定 strPath = ThisWorkbook.Path & "\Book2.xls" 'ブックの設定 Set wk1 = ThisWorkbook Set wk2 = Workbooks.Open(strPath) x = wk1.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row '最終行 y = wk1.Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column '最終列 '処理開始 ' For R1 = 1 To x If wk1.Sheets("sheet1").Cells(R1, 1).Value = "指定" Then R2 = R2 + 1 For L1 = 1 To y wk2.Sheets("sheet1").Cells(R2, L1) = wk1.Sheets("sheet1").Cells(R1, L1).Value Next L1 End If Next R1 End Sub それから、少しコードの説明をしておきます。 以下のコードをみてください。 Sub test6() Dim L1 As Long Dim R1 As Long Dim x As Long Dim y As Long Dim wk1 As Workbook Dim wk2 As Workbook Dim strPath As String '変数の初期化 'パスの設定 strPath = ThisWorkbook.Path & "\Book2.xls" 'ブックの設定 Set wk1 = ThisWorkbook Set wk2 = Workbooks.Open(strPath) x = wk1.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row '最終行 y = wk1.Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column '最終列 '処理開始 For R1 = 1 To x For L1 = 1 To y If wk1.Sheets("sheet1").Cells(R1, 1).Value = "指定" Then wk2.Sheets("sheet1").Cells(R1, L1) = wk1.Sheets("sheet1").Cells(R1, L1).Value End If Next L1 Next R1 End Sub このコードを実行すると、A列に「指定」という文字があれば その行をBook2にコピー&ペーストしていきます。しかし、 行はBook1と同じ設定になっているので、Book1で次の 「指定」の行が飛んでいればBook2には同じように 行間が飛んでコピーされます。 普通に考えればこれで用は足りのですが、質問の場合は 行間を詰めてコピーをしたい、ということのようなので、 Book2側でペーストする位置を独自に設定する必要が あります。 そこで、test5では、上記のtest6のコードにBook2の行の位置を設定 する変数R2を加え、test6の wk2.Sheets("sheet1").Cells(R2, L1) = wk1.Sheets("sheet1").Cells(R1, L1).Value を、test5では wk2.Sheets("sheet1").Cells(R2, L1) = wk1.Sheets("sheet1").Cells(R1, L1).Value に変更し、もし「指定」の文字があったらR2の値を For L1 = 1 To y ~ Next L1 の ループに入る前に1加えて独自に行を移すようにしています。 R2の初期値は0なので、最初にBook1で「指定」文字が 10行目に見つかってもBook2には最初の行にデータが ペーストされるようになっています。 コード自体は難しいことをしているのではありませんが、 二重のループで行移動と列の移動による処理を しています。
- layy
- ベストアンサー率23% (292/1222)
コピーできればいいのでなくて、 コピーさせるときの各ブックやシート、セルの指定の仕方とか繰り返しの仕方、命令がわからない、というのであれば、 事例からさらに条件つけるなどアレンジして自分で新たに作って見ましょう。その方がプログラミング能力アップになります。コード例はカンニングだ、みたいな感じでもいいんです。
- piroin654
- ベストアンサー率75% (692/917)
解決したでしょうか。 以下は質問の内容に即した方法です。 一応以下では二つのBookは同じフォルダにあるものとして、 strPath = ThisWorkbook.Path & "\Book2.xls" としています。実際に合わせて変更してください。 変更する場合は、フルパスで設定します。たとえば、 strPath = "C:\Documents and Settings\user\デスクトップ\ファイル置場\Book2.xls" のように指定します。 Sub test5() Dim L1 As Long Dim R1 As Long Dim R2 As Long Dim x As Long Dim y As Long Dim wk1 As Workbook Dim wk2 As Workbook Dim strPath As String '変数の初期化 R2 = 1 'パスの設定 strPath = ThisWorkbook.Path & "\Book2.xls" 'ブックの設定 Set wk1 = ThisWorkbook Set wk2 = Workbooks.Open(strPath) x = wk1.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row '最終行 y = wk1.Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column '最終列 '処理開始 For R1 = 1 To x If wk1.Sheets("sheet1").Cells(R1, 1).Value = "指定" Then For L1 = 1 To y wk2.Sheets("sheet1").Cells(R2, L1) = wk1.Sheets("sheet1").Cells(R1, L1).Value Next L1 R2 = R2 + 1 End If Next R1 End Sub
- layy
- ベストアンサー率23% (292/1222)
VBAでやるなら -------------- シート1:A1を選択 シート2:A1を選択 ◆ シート1:選択セルが「指定」となっているか →なっているとき →シート2の選択位置にシート1の選択行の値をセットする →シート2:1行下(のA2)を選択 →なっていないとき →シート1:1行下(のA2)を選択 →◆から繰り返し シート1の選択セルに何もないとき終了 -------------- こんな感じでしょう。 結果としては、 「指定」でフィルタをして、それをシート2へ貼り付け、と同じでしょうか。 それならVBA結果と照合してみてください。 VBAの投稿なのでVBAで頑張ってみてください。
お礼
お返事遅くなってしまい申し訳ありません。 ご丁寧にありがとうございます。 書いて頂いたコードを入力してやりたかったことはすべてできました。 自分でも少しずつできるようにしていきますが、また何かわからないことがありましたら、その際は何卒よろしくお願いいたします。