• 締切済み

エクセルVBA 無駄な部分をおしえてください

VBA初心者です。 多数のシートを条件によって二つのブックに分ける、というVBAを作ろうとしています。 なにぶん素人なので、無駄な文章が多いのではないかと心配で、 お知恵を拝借できればと思い投稿いたしました。どうぞよろしくお願いいたします。 やりたいこと:Book1のA列に100程度の文字列があり、そのいずれかと一致するシート名(Book1のSheets(2)以降)を持つシートはBook2の最終シートの後ろへ、どの文字列ともシート名が一致しないシートはBook3の最終シートの後ろへ移動。(「最終シートの後ろへ移動」がうまくいっていません) VBAの内容:Book1のH1に「=countif(A:A,G1)」と入力しておき、G1にシート名を入力させ H1>0ならば該当シートをBook2へ、それ以外はBook3へ移動 の繰り返し   Application.ScreenUpdating = False Dim j As Integer, k As Integer j = Workbooks("Book2.xls").Worksheets.Count k = Workbooks("Book3.xls").Worksheets.Count Do While Workbooks("Book1.xls").Sheets.Count > 1 Range("G1").Value = Worksheets(2).Name If Range("H1").Value > 0 Then Worksheets(2).Move after:=Workbooks("Book2.xls").Sheets(j) Else Worksheets(2).Move after:=Workbooks("Book3.xls").Sheets(k) End If Loop

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

微妙な部分なハードルになる部分がいくつもあるようですね。その分、難しいような気がします。 質問のコードとしては、アイデアとしては悪くないものの、今の段階では、完成できないような気がします。 注意:ブック名、シート名は、明示的に入れてください。ただし、wb1.Sheets(1) とwb1.Worksheets("Sheet1") は、同じものとします。それが違いますと、成功しません。なお、Sheets とWorksheets は、同じようでいて違いますから、注意が必要です。 '//標準モジュールが良い Sub Test2()  Dim i As Long  Dim j As Long, k As Long  Dim wb1 As Workbook, wb2 As Workbook, wb3 As Workbook  Dim sh1 As Sheet1    Set wb1 = ThisWorkbook  Set wb2 = Workbooks("Book2.xls")  Set wb3 = Workbooks("Book3.xls")  Set sh1 = wb1.Worksheets("Sheet1")    j = wb2.Sheets.Count: k = wb3.Sheets.Count  'Application.ScreenUpdating = False '*  For i = wb1.Sheets.Count To 2 Step -1   'あり   If Application.CountIf(sh1.Columns(1), wb1.Sheets(i).Name) > 0 Then    wb1.Worksheets(i).Move After:=wb2.Sheets(j)   Else    'なし    wb1.Worksheets(i).Move After:=wb3.Sheets(k)   End If  Next  'Application.ScreenUpdating = True '*  wb1.Activate  Set wb1 = Nothing: Set wb2 = Nothing: Set wb3 = Nothing End Sub *確認したら、外してください。

chokotoanko
質問者

お礼

>微妙な部分なハードルになる部分がいくつもあるようですね。 そうなんですよね~。微妙な部分がわかるセンスがほしいです。。。 やはり基礎からきっちり勉強しないとだめですね。 コードありがとうございました。 とても勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • wret615
  • ベストアンサー率34% (133/386)
回答No.4

ああ、ありがとう。そうか、ブックアクティブの問題だな。2度目の回答、役に立たなくてすまん。

chokotoanko
質問者

お礼

>前回最後にブックを保存したときの状態)でブックを認識するんよ。 なるほど、そりゃそうですね。気づきませんでした。 役に立たないなんてとんでもないです! 貴重な知識を伝授していただき本当にありがたいです。 また何かありましたら相談に参りますので、是非よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

▲Range("G1").Value = ●Worksheets(2).Name If ▲Range("H1").Value > 0 Then ●Worksheets(2).Move after:=Workbooks("Book2.xls").Sheets(j) Else ●Worksheets(2).Move after:=Workbooks("Book3.xls").Sheets(k) End If ▲や●の部分にブック名やシート名が省略されてるので それぞれはアクティブブック、アクティブシートを扱っていることになる よって、2回目以降はうまくいかない。 Workbooks("Book1.xls").Sheets(1)   '▲部分に付加 Workbooks("Book1.xls")         '●部分に付加 --------------------------------------- ブック名、シート名を付加しないのなら Do Whileの次か、最後のLoopの前に、 Workbooks("Book1.xls").Activate を入れてBook1.xlsをいちいちアクティブする必要がある。 --------------------------------------------- ふつうはG1,H1を使用しないで。。。 -------------------------------------------- Sub test()  Application.ScreenUpdating = False  Dim Cnt As Integer  Dim BK1 As Workbook  Set BK1 = Workbooks("Book1.xls") Do While BK1.Worksheets.Count > 1  If WorksheetFunction.CountIf(BK1.Sheets(1).Range("A:A"), BK1.Sheets(2).Name) Then    Cnt = Workbooks("Book2.xls").Sheets.Count    BK1.Sheets(2).Move after:=Workbooks("Book2.xls").Sheets(Cnt)  Else    Cnt = Workbooks("Book3.xls").Sheets.Count    BK1.Sheets(2).Move after:=Workbooks("Book3.xls").Sheets(Cnt)  End If Loop Application.ScreenUpdating = True End Sub '---------------------------------------- 以上です。

chokotoanko
質問者

お礼

スマートですねー。 わざわざコードを書いていただき、本当にありがとうございます。 今回の問題のためだけでなく、勉強になりました。 自力でここまで書けるようになるよう精進いたします! また何かありましたら相談させてください。 ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。
  • wret615
  • ベストアンサー率34% (133/386)
回答No.2

それは多分、ブックを保存しないまま続けてコードを動かすから。 保存しないと、コンピュータ側ではコードを動かす前の状態(前回最後にブックを保存したときの状態)でブックを認識するんよ。だから、2度目にコードを動かすと、「あれ、シート数が違うやん」てコンピュータがずっこける。 コード動かしたらBook2とBook3を保存してみ?そしたら続けて使えるはずだ。うまくいったら、VBAコードの最後のほうにSaveメソッド加えるといい。コンピュータが勝手にブック保存してくれるようになるから。

全文を見る
すると、全ての回答が全文表示されます。
  • wret615
  • ベストアンサー率34% (133/386)
回答No.1

無駄に思える部分があっても、思ったとおりに動くコードが一番でないかい? いっこだけ、うまくいってないて部分についてアドバイスすれば、j =とk =の2行をDo Whileの次行に移してみ?

chokotoanko
質問者

お礼

さっそくご回答いただきありがとうございます。 なるほど、うまくいきました! 順番が間違っていたんですね。たすかりました。 すみません、追加でご相談なのですが、 3ブックを開いて最初の処理はうまくいくのですが 2度目、3度目と続けて実行していると「Moveメソッドに失敗しました」というようなエラー表示が出て、Book2にシートを移動させたあたりでとまってしまいます。 これは何が原因なのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • excel vba

    テーブル情報に基づきシートをコピーするVBAマクロを記述したい。 ExcelのBook111のSheet1に次のような データが入っています。 (1、2)セルにn=3という数字が入っているものとします。 その数値に合わせて、この場合は3なので Sub Sample01() Workbooks("Book3.xls").Worksheets("booksheet3").Copy After:=Workbooks("Book111.xls").Sheet(1) End Sub のようなつまり、booksheet3なるシートをBook111(固定なBOOK)にコピーしようとしています。 このようなことをVBAで書くにはどうすればいいのでしょうか。 ただしBook名とシート名はあくまでデータの値にもとづいたデータをもってくることになります。 要するに間接参照したデータに基づき処理するのをどのように記述するかという質問です。 A列 B列 1 回数 n=3 2     3     4 Book1.xls book1sheet ←n=1 5 Book2.xls book2sheet ←n=2 6 Book3.xls book3sheet ←n=3 7 Book4.xls book4sheet 8 Book5.xls book5sheet 9 Book6.xls book6sheet ←n=6 10 Abc,xls Defsheet ←n=7

  • ExcelのVBAについてです。

    例えば"Book1.xls"という名前のブックの"Sheet1"という名前のシートの一部を削除する。 これをVBAでやらせようと思うんですが、"Book1.xls"を開かずに行うことはできるんでしょうか。 Workbooks("Book1.xls").Worksheets("Sheet1").Range("C7:M51").ClearContents のようにしてるんですがうまくいきません。 "Book1.xls"はLAN上のブックで実際はフルパスで指定してます。 よろしくお願いします。

  • Book間の移動

    Excel VBA でBook2にシートを移動した後、元のBook1に自動で戻る VBAを教えたください。 Sub シートを移動する() Windows("Book1.xls").Activate Sheets(エリカ).Select Sheets(エリカ).Move After:=Workbooks("Book2").Sheets(1) このあとBook1に戻りたい! End Sub

  • エクセル2000のマクロについて再び

    新しいブックを作りさらに他のブックで作成されているシートをコピーして移動するというマクロを作ります。この時、新しく作ったブックの名前がBook1にならないとその時点でマクロのエラーになりなってしまいますが、たまにBook2になってしまうときがあります。必ずBook1になると指定することはできないのでしょうか。 Sheets(Array("sheet1", "sheet2", "sheet3")).Select Sheets(Array("sheet1", "sheet2", "sheet3")).Copy →新しいシートを作成 Workbooks.Open Filename:="C:xxx\○○\△△.xls" Sheets.Copy after:=Workbooks("book1").Sheets(2) →ここで、Book1が存在しないとエラーになってしまう。 お願いします。

  • Excel VBA 指定シートの取込

    こんにちは。 ExcelのVBAを使用して、異なるBookのシートを取込みたいのですが、 シートが無かった場合の処理方法がわかりません。 現在のコードは下記の様になっております。 With Workbooks.Open"BOOK1.xls" .Worksheets("Sh1").Cells.Copy ThisWorkbook.Sheets("Sheet1").Range("A1") .Worksheets("Sh2").Cells.Copy ThisWorkbook.Sheets("Sheet2").Range("A1") .Worksheets("Sh3").Cells.Copy ThisWorkbook.Sheets("Sheet3").Range("A1") .Close End With Book1に指定したシートが無い場合、何もしないようにしたいのですが、 どの様に書き換えれば宜しいでしょうか? よろしくお願いします。

  • エクセルVBA 数式の中に、変数で定義したシート名を入力するには

    いつもお世話になります。 =SUMPRODUCT(('[BOOK1.xls]SHEET1!$D$20:$D$1000=$E$4)*('[BOOK1.xls]SHEET1!$D$20:$D$1000!$O$20:$O$235>=$B9)*('[[BOOK1.・・・ という長い数式を、VBAに書き込みたいのですが、関数が長すぎるせいか、書き込めません。 そこで、 Dim SH1 As Worksheet SET SH1 = Workbooks("BOOK1.xls").Worksheets("SHEET1") として、[BOOK1.xls]SHEET1!をSH1に省略したいのですが、どのように数式に組み込めば良いでしょうか。

  • Excelマクロ(VBA)のブックとシートのコピーについて

    初めまして、宜しければVBAのブックやシートのコピー(操作)についてご教授お願いいたします。 Windows XP x64 OFFICE2003 を使用しております。 D:\Book1.elxのsheet1のシートをD:\test\Book2.elxのsheet1のシートに コピーする方法が恥ずかしながら理解できておりません。 以下が行いたい事です。 Sub ボタン1_Click() 'text1ブックを開く 'Workbooks.Open "D:\micro\test1.xls" 'ブック間のシートをコピー Workbooks("test2.xls").Worksheets("シート2").Copy _ After:=Workbooks("test1.xls").Worksheets("Sheet2") End Sub VBのファイル操作とは違い、どのように行えば良いのか検索しても同じような部分サンプルのようなものしか無く、理解できておりません。 参考でも結構ですのでご教授いただけませんでしょうか? よろしくお願いいたします。

  • .xlsにワイルドカードを使うには?

    あい20060925.xls  を下記のように記述してはいけないようですが、 ワイルドカードをどのように使用すればよろしいでしょうか? 以上 よろしくお願い致します。 -------------------- Sub tes1() '任意のブックの全シートを1つのブックにまとめる Workbooks("あい*.xls").Activate ActiveWorkbook.Worksheets. _ Copy after:=Workbooks("集計.xls").Sheets(Workbooks("集計.xls").Sheets.Count) End Sub --------------------

  • 「 VBA の 宣言 」 がない場合の問題点は ?

    下記例で、 「 宣言 」 なしでも、現在のところ、問題は発生してませんが、 今後、「 宣言 」 がなかった場合の 「 問題点の例 」 を教えて下さいませ。 ------------------------------- Sub ブックA*の全シートをコピー() Dim Wb As Workbook '宣言 For Each Wb In Workbooks If Wb.Name Like "ブックA*.xls" Then With Workbooks("ブックB.xls") Wb.Worksheets _ .Copy after:=.Sheets(.Sheets.Count) End With End If Next Worksheets(Worksheets.Count).Activate MsgBox ActiveSheet.Index Worksheets("Sheet1").Select End Sub

  • エクセルのシートのコピーについて

    シートのコピーをVBAで行いたいのですが、エラーになってしまいます。 間違っている箇所が分からないのでご教授お願いします。 貼り付けというブックにマクロが組まれています。 ”データ”のブックにあるシート名が”貼り付けのブックのリスト”のシートに記載されています。 リストのシートに記載されているシートを貼り付けのブックにコピーしたいです。 よろしくお願いします。 Sub シートコピー() 行数 = 2 Do Until IsEmpty(Cells(行数, 3).Value) コピー元 = Workbooks("貼り付け.xls").Worksheet("リスト").Cells(行数, 3) Workbooks("データ.xls").Worksheet(コピー元).Copy After:=Workbooks("貼り付け.xls").Sheets(Workbooks("貼り付け.xls").Sheets.Count) 行数 = 行数 + 1 Loop End Sub

このQ&Aのポイント
  • 筆まめVer.30 の宛名住所レイアウトについて調べましたが、フリーレイアウト機能を使用しても全ての住所録がフリーレイアウトになってしまう問題があります。
  • 個別にフリーレイアウトを設定する方法があるのか調べましたが、解決策は見つかりませんでした。
  • 宛名住所レイアウトの問題を解決する方法を教えてください。
回答を見る

専門家に質問してみよう