• ベストアンサー

EXCEL VBAで思ったように動いてくれないのですが。

度々すみません。お世話になります。Win98-EXCEL2000での処理です。 やりたいことは、A~Eまでのファイルを変数で開き、各ファイルの総シート数の1/2のシート数のシート(1)~シート(?)までを処理し、1つ目のファイルのシート処理が終わった段階で合計をして、別シートに合計のみを転記、次のファイルの処理へ移動したいのです。 WithやLoopの使い方や、SETやNextはどこで書いていいのかがよく解っていないので、何をどこでどう書いてよいのか教えてください。多分意味不明だと思うので、補足しますのでお願いします。今の処理だとSheetYOの合計処理がすっ飛ばされているような気がします。 Sub TEST() 各種変数宣言 For iii = 1 To 4 If iii = 1 Then f = "A_log" ElseIf ・・・残りB~Eまで入力 Exit For End If Next iii Workbooks.Open Filename:=f & ".xls" c = Worksheets.Count / 2  With sheetSET Set sheetSET = Workbooks(f & ".xls").Sheets(iiii) Set sheetYO = マクロを書いているファイルです。 Do Until iiii = c For iiii = 1 To c   If iiii = 1 Then      オートフィルタ処理 Sheets(iiii).AutoFilter.Copy sheetYOにコピー処理 Else 上記と同じオートフィルタ処理 Sheets(iiii).AutoFilter.Range.Offset(1, 0).Copy 上記の最終行+1にコピー処理 Exit For End If Next iiii Loop End With With sheetYO    別シートに合計のみを転記 End With Workbooks(f & ".xls").Close False End Sub

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

  • ベストアンサー
  • TTak
  • ベストアンサー率52% (206/389)
回答No.4

ループで変数を代入して処理する場合は、処理のコードはすべてループ内に記述する必要があります。また、処理が複雑な場合はサブルーチン(別のプロシージャ)で変数を渡して、処理を飛ばしてもいいです。 さて、内容的には少し判りにくいので、次のような処理かなぁと予想してます。違ってたら、補足してください ファイルAを開く 開いたファイルのシート1のオートフィルタ結果をコピー 現在のファイルのシートYOに結果をペースト 開いたファイルのシート2のオートフィルタ結果をコピー 現在のファイルのシートYOに結果をペースト 開いたファイルのシート3のオートフィルタ結果をコピー ・・・シートの半数分繰り返す・・・ ファイルAを閉じる ファイルBを開く ・・・以下ファイルAと同様にFまで繰り返す・・・ するとマクロの例は次のようになります。オートフィルタ云々、コピーペースト云々は、別に質問してください。このマクロは動作確認してませんので、流れだけつかんでください。 Sub test() Dim iii As Integer Dim iiii As Integer Dim openFileName As String '---オープンファイル名 Dim openFilePath As String '---オープンファイルパス Dim c As Integer '---ファイルに含まれるシート数÷2 'iiiを1から6までループ For iii = 1 To 6 'Chr関数を使って文字コードからA~E文字列を取得 'し、ファイル名A~E_log.xlsを順次作成する  openFileName = Chr(64 + iii) & "_log.xls" '開くファイルが格納されているフォルダのパスを取得 'ここでは、このマクロがあるファイルと同じパスを指定  openFilePath = ThisWorkbook.Path 'ファイルを開く  Workbooks.Open Filename:= _  openFilePath & "\" & openFileName '開かれたファイルのシート数÷2の値を取得 'シート数が奇数の場合は切り捨て  c = Int(Worksheets.Count / 2) 'iiIiを1からcまでループ  For iiii = 1 To c   If iiii = 1 Then   'シート1の場合の処理    Sheets(iiii).AutoFilter.Copy    '****************************    'シートYOへペースト処理マクロ    'をここに記入する    '****************************   Else   'シート1以外の場合の処理をここに記入    Sheets(iiii).AutoFilter.Range.Offset(1, 0).Copy    '****************************    'シートYOへペースト処理マクロ    'をここに記入する    '****************************   End If  Next iiii Workbooks(openFileName).Close False Next iii End Sub

nanami0310
質問者

お礼

TTakさん、いつもありがとうございます。 すごいです、その通りの処理がしたいんです! ですが、私の方の理解が遅くてループの説明んとこでつまずいてます(T_T) この'Chr関数を使って文字コードからA~E文字列を取得 'し、ファイル名A~E_log.xlsを順次作成する ですが、説明が悪くて申し訳ありません。例としてA~Eとしてしまいましたが、実際のファイル名は各々恐ろしくややこしい名前がついてます。が、その場合もこれでいけるのでしょうか・・・?

nanami0310
質問者

補足

度々申し訳ありあません。「openFileName = Chr(64 + iii) & "_log.xls" 」がちょっと理解できなかったのでlaputartさんのを流用させて頂いて、チェンジディレクトリの仕方が分からなくて「openFilePath =」以降に普通に入力したら、当然ですがエラーになってしまいました。お手数ですが、方法教えてください。 For iii = 1 To 4 Select Case iii Case 1 f = "ALR252偏貼_log" Case 2 f = "ALR252Cof_log" Case 3 f = "ALR252終検セル_log" Case 4 f = "ALR252M2点灯_log" End Select openFileName = f & ".xls" openFilePath =     ChDrive "Z"     ChDir "\共有\検査データ\外注データ\コスモ電子\Alr252\update".Path

その他の回答 (4)

  • TTak
  • ベストアンサー率52% (206/389)
回答No.5

ファイル名が単純で連続な文字でないならChr関数は使えません。ファイル名に関わらず、特定のフォルダ内、たとえば"C:\My Documents"内のexcelファイルすべてについて同じ処理をするなら、FileSearch関数とFor~Next文の組み合わせが便利です。 With Application.FileSearch  .NewSearch  .LookIn = "C:\My Documents"  .FileType = msoFileTypeExcelWorkbooks  If .Execute() > 0 Then   For iii = 1 To .FoundFiles.Count    openFileName = .FoundFiles(i)   '----この間の処理は前の解答に同じ   Next iii  End If End With 所感ですが、このような処理をさせるコーディングはExcelVBAでも、上級者が扱う範囲と思います。 nanamiさんはいつも実務的な処理に関する質問が多いですね(^^;) VBAは使うことができると便利ですが、必ずしもすべてに有効というわけではありません。ちなみに私の場合、いかにVBAを使わずに済ませるか、たとえ使ってもいかに簡素であるかということを最初に考えています。 そのためにフォーマットの方を変更したり、シート名やファイル名を変えたりする場合もありますし、場合によってはフォーマットを作った業者に頼んで、変更して貰う場合もあります。フォーマットが統一されると、自分で作ったプログラムをコンポーネント化して、他のプログラムから呼び出して使うこともできるのです。 まずは、今やっている作業をフローにして、共通化できる部分、変数にする部分を十分に把握してから質問してみてはいかがでしょう。フローを示すことができれば抽象的でもかまいませんよ。解答も的確に付くでしょう。 がんばってください(^^).

nanami0310
質問者

お礼

ごめんなさい、補足が入れ違いになっちゃいましたね。 VBA使える方は便利でいいなと思いましたが、「いかに使わないか」を考えるんですね・・・反省です。 今、各ファイルごとにマクロを組んでいて、5回ボタンを押せばちゃんと動くのですが、実際使用する人に1つのボタンでなんとかならないの?といわれてちょっとよくばって力量以上のことをしてしまいました。 今回もまた聞いたことない文が出てきて、やっぱりこれ以上は無理かなと・・・ いつも親切なアドバイスありがとうございます。 また、宜しくお願いします。

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.3

こんにちは。 回答ではなく、アドバイスを。 >WithやLoopの使い方や、SETやNextはどこで書いていいのかがよく解っていないので、 >何をどこでどう書いてよいのか教えてください たとえば、同じセルに対して書式をいくつも設定するときなどのように、 Withを使えば対象となるオブジェクトの指定をまとめて記述できるので、 見た目すっきり&処理も若干早くなります。 しかし、使い方がよくわかっていない時点で、 無理にWithは使わなくてもいいのではないでしょうか? 現状では、ご自分でもどのようなプログラム構造になっているか、 把握できていらっしゃらないのでは? ひとまずWithをつかわない(対象を省略しない)書き方で、 [動作するコード]を書くことが肝心ですよ。 自分で書いたコードの全体像がつかめたら、 それからコードの整理に着手すれば良いのではないでしょうか。 あと、For~Nextなどのように、 つねに一対のものとして扱う処理は、 最初にFor~Nextの構文を完成させておいて、 あとからその行間にコードを挿入していく、というスタイルのほうが 間違いが少なくなると思います。 それと、もう実践されているかもしれませんが、 行頭にタブなどを効果的に挿入して、ループの範囲を字下げするなどして 極力コードの視認性を良くする工夫が必要かもしれませんね。 あと、Setをする位置ですが、 Setしたものを実際に参照する行より前に書かないと意味がないですよ。 With sheetSET の行が、 Set sheetSET = … の行よりも前に来てますよね。 これでは、まずいわけです。

nanami0310
質問者

お礼

ありがとうございます。 そうなんですよね、上から順番に書いてくからいつも???が多くなってしまって。。。 ありがとうございました。作り方をまず変えてみますね。

  • laputart
  • ベストアンサー率34% (288/843)
回答No.2

分法的にIF文を構造的にしないとエラーに なりませんか (次の行のELSEから....) それと入れ子にした方が構想的なので、処理の詳細は 分かりませんが全体の構造は私ならこんな風に設計 します。 それとiiiiのループ文ですが 2回目以降に Do Until iiii = c に来た時iiii=cならその後が実行されませんので こんな構造にしました。 --------------------- For iii = 1 To 4 Select Case iii Case 1 f = "A_log" Case 2 f = "A_log" Case 3 f = "A_log" Case 4 f = "A_log" End Select '-----ファイルオープン------ Workbooks.Open Filename:=f & ".xls" c = Worksheets.Count / 2 With sheetSET Set sheetSET = Workbooks(f & ".xls").Sheets(iiii) Set sheetYO = マクロを書いているファイルです。 iiii = 1 '----------ループの始め-------- Do Until iiii = c Select Case iiii Case 1 オートフィルタ処理 Sheets(iiii).AutoFilter.Copy sheetYOにコピー処理 Case Else 上記と同じオートフィルタ処理 Sheets(iiii).AutoFilter.Range.Offset(1, 0).Copy '上記の最終行+1にコピー処理 End Select iiii = iiii + 1 Loop '----------ループ終了-------- End With '----------------- With sheetYO 別シートに合計のみを転記 End With '------------------ Workbooks(f & ".xls").Close False Next iii

nanami0310
質問者

お礼

ありがとうございます! この構造に変えたら、ループの終了までは正常に動いてくれました! そか、Select Case を使ったほうがいいんですね。 今度は「別シートに合計のみを転記 」の段階でつまずいてますが・・・見直してまた解らなかったら宜しくお願いします。 ありがとうございました。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

なんか いろいろ問題がありそうですね。 まず、最初のほう For iii = 1 To 4 If iii = 1 Then f = "A_log" ElseIf ・・・残りB~Eまで入力 Exit For End If Next iii これは 最後 iiiが 4になりますので、 多分 fに1から順に A B C D E とセットしていったら 4番目の Dと なって ループから 抜けるでしょう。 つまり、その前まで A B C とセットしたのが 意味が なくなります。 もう少し、ロジックを見直す必要がありますね。

nanami0310
質問者

お礼

そうなんですよね。 最初に開くファイルが最後のになったので、Exit For~Nextiiiを最後に持ってきたらExit Forに対するForがありませんとか、同様にIfがありませんとか出てきました。 なのでこういう場合はどう処理したらよいのでしょうか。

関連するQ&A

  • エクセルVBAで書式と値の貼付けにつて

    エクセル2007VBAで新規ファイルを作る場合のコピー、貼り付けで質問しましたが 式も全て貼り付けになるとUSBメモリーで持ち出した場合、エラーとなります。 それで値と書式のみ貼り付けする様下記の様に書き直しましたが、.PasteSpecialでメソッドまたはデータメンバーが見つかりませんとなります。 ぐぐっててヘルプを見ますが解決出来ません。どなたがご教授お願いします。 元の式 Sub DGCopy() Workbooks.Add With ThisWorkbook .Sheets(5).Cells.Copy Sheets(1).Cells Sheets(1).Select Sheets("Sheet1").Name = "電気代" .Sheets(6).Cells.Copy Sheets(2).Cells Sheets(2).Select Sheets("Sheet2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ' ダイアログでCancelをクリックした場合 ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub 書き直した式 Sub DGCopy() Workbooks.Add With ThisWorkbook Sheets(5).Select Cells.Selection.Copy Sheets(1).Selection .PasteSpecial Paste:=xlPasteFormats ←エラー部分 .PasteSpecial Paste:=xlPasteValues Sheets("sheets1").Name = "電気代" Sheets(6).Select Cells.Selection.Copy Sheets(2).Selection .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues Sheets("sheets2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub

  • 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で、途中で処理が終わってしまいます。

    お世話になります。No.843313の続きになるのですが、思った通りに動いてくれませんでした。 やりたいことは、「Cells(97,4)まで数字が入ったら、次はCells(7,13)に移動して処理1を繰返したい」というものなのですが、Cells(97,4)まで入ったところで終了してしまい、次のCells(7,13)へ移動してくれません。エラーメッセージも出ていません。 どうしたらいいのでしょうか?宜しくお願いします。 (見やすいように字下げできませんでした。見難くてごめんなさい。) iii = 4 With sheetIRO ’処理1  For ii = 7 To 97 Step 10    If .Cells(ii, iii).Value = "" Then    .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _    = Sheets("Result").Range("G20:I24").Value   Exit For  End If If ii = 97 Then   iii = iii + 9   ii = 7   Exit Sub End If Next ii End With

  • 「 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について勉強中です

    以下の構文を実行しました。 結果、Bファイルにはsheet(仮)が挿入されましたがAファイルのsheet1がコピーされません。 どこがどのように間違っているのかわかりません。 どなたかご教授ください。 Sub コピー() Dim sc '貼り付け先ファイルのシート数 Dim scn '貼り付け先ファイルのシート名 Dim F_T '貼り付け先ファイル名 Dim F_0 'コヒー元ファイル名 Dim cc 'コピー元のシート数 Dim ccn 'コピー元のシート名 On Error GoTo ed 'エラーの場合の処理 F_T = Application _ .GetOpenFilename("エクセルファイル(C:\Users\***\Desktop\B\B.xlsx),C:\Users\***\Desktop\B\B.xlsx", _ , "貼り付け先ファイルを開く") If F_T = False Then GoTo ed Workbooks.Open F_T F_T = ActiveWorkbook.Name sc = Workbooks(F_T).Sheets.Count '作業用の仮シートの追加 ActiveWorkbook.Sheets.Add After:=Worksheets(sc) ActiveSheet.Name = "仮" F_0 = Application _ .GetOpenFilename("エクセルファイル(C:\Users\***\Desktop\A\A.xlsm),C:\Users\***\Desktop\A\A.xlsm", _ , "コピー元ファイルを開く") If F_0 = False Then GoTo ed Workbooks.Open F_0 F_0 = ActiveWorkbook.Name cc = Workbooks(F_0).Sheets.Count 'このブックのシート名のすべてを繰り返し For f = sc To 1 Step -1 scn = Workbooks(F_T).Sheets(f).Name 'コピー元のブックのシート名を繰り返し For T = 1 To cc ccn = Workbooks(F_0).Sheets(T).Name 'もし、シート名が同じなら If scn = ccn And Workbooks(F_T).Sheets.Count > 1 Then 'シートの削除 Application.DisplayAlerts = False Workbooks(F_T).Worksheets(ccn).Delete Application.DisplayAlerts = True Else End If Next T Next f 'コピー元のブックのシート名を繰り返し For T = cc To 1 Step -1 ccn = Workbooks(F_0).Sheets(T).Name 'シートのコピー Workbooks(F_0).Worksheets(ccn).Copy _ Before:=Workbooks(F_T).Worksheets(1) Next T '作業用の仮シートの削除 Application.DisplayAlerts = False Workbooks(F_T).Worksheets("仮").Delete Application.DisplayAlerts = True Workbooks(F_0).Close SaveChanges:=False Exit Sub ed: MsgBox "エラーが発生したため、処理を取り消しました" End Sub

  • 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 呼出し

    エクセルVBA 呼出し FormをひらいてTextBox31に数字(ID番号)が入り それをSheet”計”のF4に入れます! そのF4を他のブックの WSName = "DATA.xls"にて IDを検索して、名前や色々なものをSheet”計”に写します。 それを再度、FromのそれぞれのTextBoxに入れます。 しかし、SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 が上手くできません!!エラー表示などはないのですが… DATA.xlsにはID番号があるのですが、それを入力しても値が入りません どこの部分が間違っているのか? すいません、教えてください WSName = "DATA.xls"を呼出す記述は省略!! 'DATA.xlsとSheet1をセットする。 Set WS = Workbooks(WSName) Set SH1 = WS.Worksheets("Sheet1") 'ブックが存在していないのであればメッセージを出し処理を抜ける。 Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If flag = False For lng = 1 To lngYcnt_K '計のF4と同じ値を見つけてテキストボックスの値を入力。 If CStr(Worksheets("計").Range("F4").Value) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then SH1.Cells(lngNumber, 2) = Worksheets("計").Range("B2").Value '名前 With Worksheets("計") ’計のSheetの値を開いているFromのTextBox4に再度値を入れる TextBox4.Value = .Range("B2").Value '計のSheetからTextBox1の値の名前’ End With MsgBox " 記録を呼び戻しました" Else TextBox31.Value = "確認必要" End If

  • EXCEL VBAで変数を使ってファイルを開きたいのですが。

    いつもお世話になります。Win98-EXCEL2000での作業です。 いくつかのファイルで同じ処理をしたいので、変数を使ってファイルを開くことができたらいいなと思って、こんな感じがいいなと作ってみたのですが、 Dim iii As Integer Dim myF As String For iii = 1 To 5 If iii = 1 Then myF = "偏貼_log" ElseIf iii = 2 Then myF = "Cof_log" ・・・と、5つのファイル名を入れて、 Workbooks.Open Filename:="myF.xls" としたいのですが、当然ここで変数が入っても「myF.xls」というファイルを探しに行ってしまいますよね・・・ こういう場合はどうすればよいのでしょうか。 宜しくお願いします。

  • エクセルVBA:コピーの貼り付け先

    VBA初心者です。よろしくお願いします。 あるデータベースをセルB2に入力されている値で絞込み、 シート2に貼り付けるとき、下記の(1)がおそらく正解だと思いますが、 ★(質問1) (2)でも同じ結果が得られました。コピー先の目的地を示す「Destination:=」の部分は省略して全く問題なしと考えてよろしいのでしょうか? ★(質問2) (3)で試してみても同じ結果が得られました。range("sheet2!A1") なんて書き方は、たまたま、試してみたらできちゃった(同じ結果が得られた)のですが、使い方として問題ありませんか? ------------------------------------------------------------- (1) Sub test01() With Range("A1") .AutoFilter field:=2, Criteria1:=Range("B2") .CurrentRegion.Copy Destination:=Sheets("Sheet2").Range("A1") .AutoFilter End With End Sub -------------------------------------------------------------- (2) Sub test01() With Range("A1") .AutoFilter field:=2, Criteria1:=Range("B2") .CurrentRegion.Copy Sheets("Sheet2").Range("A1") .AutoFilter End With End Sub -------------------------------------------------------------- (3) Sub test01() With Range("A1") .AutoFilter field:=2, Criteria1:=Range("B2") .CurrentRegion.Copy Range("Sheet2!A1") .AutoFilter End With End Sub

  • エクセル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

専門家に質問してみよう