エクセルVBAでファイル作成

このQ&Aのポイント
  • エクセルVBAでデータをフィルタで抽出して別のブックに転記し、名前をつけて保存する方法についての質問です。
  • 処理するデータが多いため、毎回新たにファイルを開かずに処理する方法を知りたいです。
  • 今回は別のブックに転記する必要があるため、別シートに転記してから移動する方法は不適切です。
回答を見る
  • ベストアンサー

エクセルVBAでファイル作成

エクセルVBAで、データをフィルタで抽出し、別なBOOKの指定シートに転記し、名前をつけて保存したいのです。一応、下記のコードでテストは成功しました。 しかし下記コードでは1回ごとにデータの転記先を開かなくてはなりません。 処理する件数が多いので、できればいちいち新たに開き直さなくともよい方法はないでしょうか? 最初から開いておいて、転記後名前をつけて保存すると、開いていたファイルが閉じてしまい、うまくいきません。 別BOOKでなく別シートに転記して、そのシートをMoveして別ファイル保存ならわかるのですが、今回はどうしても別BOOKに転記しなければなりません。 よろしくお願いします。 Option Explicit Sub データ分割転記()   Dim myPth As String, fname As String   Dim myRng As Range, myC As Range   Dim i As Long, x As Long   Dim wb(2) As Workbook   Dim ws As Worksheet   Dim t As Single   t = Timer   Set wb(0) = ThisWorkbook   myPth = wb(0).Path   With wb(0).Sheets("Key")     Set myRng = .Range("A2", .Range("A2").End(xlDown)) 'KeyData   End With      For Each myC In myRng     Application.EnableEvents = False     Set wb(1) = Workbooks.Open(Filename:=myPth & "\20150806TEST.xlsm")     Set ws = wb(1).Sheets("List")        With wb(0).Sheets("DATA")       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A9")       .ShowAllData     End With     With ws       x = .Cells(Rows.Count, "A").End(xlUp).Row       myC.Offset(, 2).Value = x '行数確認       .Range("A9").Value = 1       If x > 9 Then         .Range("A9").AutoFill Destination:=.Range("A9:A" & x), Type:=xlFillSeries '連番       End If     End With     wb(1).SaveAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm"     wb(1).Close (False)     Application.EnableEvents = True     i = i + 1   Next   MsgBox i & "件を完了" _   & vbCrLf & Timer - t & " Sec." End Sub *Application.EnableEvents = False を使っているのば別BOOKが持つイベントマクロを作動させないためです。

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

  • ベストアンサー
回答No.2

こんにちは。お邪魔します。 題意への理解が至っているか自信はありませんが、 一応一通りのテスト環境を作って、 ご提示のSub、こちらが提示するSub、双方、 動作確認と簡単な検証は済ませています。 > いちいち新たに開き直さなくともよい方法はないでしょうか? いちいち新たに開き直すことについて、どのような問題意識を持って質問に至るのか、 明示的に書いた方が回答が付け易いのかな?と感じました。 ご提示のSub、で、お求めに対して十分な結果が得られている?ということなのだとして、 「冗長な気がする」「もっとスッキリした記述が好ましい」「処理が遅い」 尺度によってトライは変わるかと思いますが、 それぞれの観点でにバランス良く改善が見られる方法、という難題としてお応えします。 > 最初から開いておいて、転記後名前をつけて保存すると、開いていたファイルが閉じてしまい、うまくいきません。 「閉じてしまい」というより、閉じるように命令している訳ですから、 直接的な回答としては、 >  wb(1).Close (False) を、ループの内側に書かないで済むように単純な設計を選ぶ、ということになるのではないでしょうか。 誤解が生まれないように少しだけ補足しますが、 wb(1)については、 >    wb(1).SaveAs ... を実行したとしても、wb(1)というWorkbookオブジェクトを捉え続けています。 言い換えると、 VBAからみれば、(VBProjectから他のProjectや他のクラス/ライブラリを参照しているという前提に帰れば) .SaveAsの前後でwb(1)のブック名は変わりますが、 ひとつ(単一/同一)のブック(視覚的にも常に表示されるひとつのブック) をオブジェクトとしてを捉えていることに (wb(1)オブジェクトのインスタンスを解放(Set wb(1) = Nothing)するまでは、仮令wb(1)を閉じたとしても) 変わりはありません。 ですので、 .Copyメソッドで、wb(0).Sheets("DATA")の抽出データを、 貼り付けた(ws.Range("A9")以下の)セル範囲を、 .SaveAsの後で、元に戻してやれば、 >  wb(1).Close (False) ブックを閉じる必要はない、 ということが、今課題への直接的な解になるのだと考えています。 後は修正の範疇で、こちらが仮に設定した、     ws.Rows("9:" & x).Clear を (セル範囲を更に限定するとか、Deleteするとか、書式のコピーを追加するとか、  予めSheets("List")の全セルのコピーをとって置いて、都度、貼り付け直す、とか) 実際の必要に合わせて工夫してみてください。 > 別BOOKでなく別シートに転記して、そのシートをMoveして別ファイル保存ならわかるのですが、今回はどうしても別BOOKに転記しなければなりません。 Moveする前提で考えるなら、 元の雛型ブック"20150806TEST.xlsm" を、テンプレートブック"20150806TEST.xltm"として保存しておけば、   With wb(0).Sheets     .Add Type:=myPth & "\20150806TEST.xltm", After:=.Item(.Count)   End With   wb(0).Sheets(indexarray).Move ' indexarray は wb(0).Sheets.Count または 配列   Set ws = ActiveWorkbook.Sheets("List")   ' ' 処理///抽出→転記→集計→付番   With ActiveWorkbook     .SaveAs _       Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm", _       FileFormat:=xlOpenXMLWorkbookMacroEnabled     .Close False   End With のような流れで、一応可能は可能ですが、 この方法で改善点を見いだせる点があるとすれば、それはかなり特殊な事例です。 実際に書いて動かしましたが、より冗長で解り難く処理も遅くなります。 僭越ながら#1補足コメントについて、 > それまでのファイルが残ってほしいのです。 「残ってほしい」のは何?という具体的な話があれば、 確信を持って応えることができる方は多数いらっしゃるかと、 元の雛型ブック、またはシート、(またはグラフ、テーブル、などなど)の どのような属性(データ、書式、保護、ファイルフォーマット、などなど)を 踏襲させたいのか、によって、アプローチの仕方は多数あるように思います。 > いろいろしらべましたところ、SaveAs ではなくSaveCopyAsを使えばなんとかなりそうです。 先に元の雛型ブックをSaveCopyAsしてから、処理すれば、それはそれで出来るとは思いますが、 少し題意と逸れた気もしますし、言及するつもりはありません。 本題に帰って、 以下、提示するSubについてです。 概念的な理解を確かめておいて欲しいので、繰り返し強調しますが、 このSubプロシージャで扱うブックの数は、(Excel的にもVBA的にも) 処理全体を通じて、二つ、だけです。 結果的に作成/保存されるブックは、Keyの数、だけ複数です。   Dim wb(2) As Workbook のような宣言を嗜好する向きには、整合性のとれた設計になっているとは思います。 必要最低限の書換えだけでお応えしますので、 エラー処理の追加、や、その他の最適化は書き加えません。 ご提示のSubでエラーになるケース、 (代表例で、Sheets("DATA")にフィルターが掛かっている場合の一部、など) では、同じようにエラーがでます。 もし、こちらが提示したSubで、固有のエラーや誤作動が起こるとすれば、     ws.Rows("9:" & x).Clear 由来のものに(ほぼ)限定されます。 もし、何か不足はあれば、補足欄にでも書いてみてください。 ' ' /// 動作確認環境は、Win7/xl2010/vba7 Sub Re9025307w() ' データ分割転記   Dim myPth As String, fname As String   Dim myRng As Range, myC As Range   Dim i As Long, x As Long   Dim wb(2) As Workbook   Dim ws As Worksheet   Dim t As Single   t = Timer   Set wb(0) = ThisWorkbook   myPth = wb(0).Path   With wb(0).Sheets("Key")     Set myRng = .Range("A2", .Range("A2").End(xlDown)) 'KeyData   End With   Application.EnableEvents = False   Application.ScreenUpdating = False   Set wb(1) = Workbooks.Open(Filename:=myPth & "\20150806TEST.xlsm")   Set ws = wb(1).Sheets("List")   For Each myC In myRng     With wb(0).Sheets("DATA")       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A9")       .ShowAllData     End With     With ws       x = .Cells(Rows.Count, "A").End(xlUp).Row       myC.Offset(, 2).Value = x '行数確認       .Range("A9").Value = 1       If x > 9 Then         .Range("A9").AutoFill Destination:=.Range("A9:A" & x), Type:=xlFillSeries '連番       End If     End With     wb(1).SaveAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm"     ws.Rows("9:" & x).Clear     i = i + 1   Next   wb(1).Close (False)   Application.EnableEvents = True   Application.ScreenUpdating = True   MsgBox i & "件を完了" & vbCrLf & Timer - t & " Sec." End Sub ' ' //

emaxemax
質問者

お礼

realbeatin 様 http://okwave.jp/qa/q8939737.html http://okwave.jp/qa/q8908989.html では大変お世話になりました。 今回もありがとうございます! > .Copyメソッドで、wb(0).Sheets("DATA")の抽出データを、 > 貼り付けた(ws.Range("A9")以下の)セル範囲を、 > .SaveAsの後で、元に戻してやれば、 >>  wb(1).Close (False) > ブックを閉じる必要はない、 > ということが、今課題への直接的な解になるのだと考えています。 言われてみれば、まったくその通りでした! おかげさまで今回も無事解決いたしました。 またSaveCopyAs でも以下のように試してみました。 時間的にはこちらのほうが若干早いようです。 Sub データ分割転記New()   Dim myPth As String, fname As String   Dim myRng As Range, myC As Range   Dim i As Long, x As Long   Dim wb(2) As Workbook   Dim ws As Worksheet   Dim t As Single   t = Timer   Set wb(0) = ThisWorkbook   myPth = wb(0).Path   Application.ScreenUpdating = False   Application.EnableEvents = False   Set wb(1) = Workbooks.Open(Filename:=myPth & "\20150806TEST.xlsm")   With wb(0).Sheets("Key")     Set myRng = .Range("A2", .Range("A2").End(xlDown)) 'KeyData   End With      For Each myC In myRng     Application.EnableEvents = False     Set ws = wb(1).Sheets("List")          ws.Range("A9:XFD" & Rows.Count).ClearContents        With wb(0).Sheets("DATA")       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A9")       .ShowAllData     End With          With ws       x = .Cells(Rows.Count, "A").End(xlUp).Row       myC.Offset(, 2).Value = x '行数確認       .Range("A9").Value = 1       If x > 9 Then         .Range("A9").AutoFill Destination:=.Range("A9:A" & x), Type:=xlFillSeries '連番       End If     End With     wb(1).SaveCopyAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm"          fname = Dir(myPth & "\作成ファイル\" & myC.Value & ".xlsm")     If fname <> "" Then '保存されたか念のため確認       myC.Offset(, 1).Value = "完了"     Else       myC.Offset(, 1).Value = "該当なし"     End If          i = i + 1   Next   wb(1).Close False   Application.EnableEvents = True   Application.ScreenUpdating = True   MsgBox i & "件を完了" _   & vbCrLf & Timer - t & " Sec." End Sub

その他の回答 (1)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

保存される前のどこかに「Application.DisplayAlerts = False」を入れられてはどうでしょうか? この1行を入れると、確認メッセージが表示されません。 したがって、同じファイル名があった場合は、勝手に上書き保存されるので、その点は注意が必要ですが、ファイル名が順番に変わるようになっているので、大丈夫かと思います。

emaxemax
質問者

お礼

ありがとうございます。 ただ、 wb(1).SaveAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm" wb(1).Close (False) と、保存してから終了させているので、閉じる際のアラートはでません。 Application.DisplayAlerts = False は不要です。 質問の書き方が良くなかったかもしれません。 名前をつけて保存をすると、新たにできたファイルが残り、それまでのファイルは保存されずに終了してしまいます。(手動でもそうなのですから当然ですが) それまでのファイルが残ってほしいのです。 いろいろしらべましたところ、SaveAs ではなくSaveCopyAsを使えばなんとかなりそうです。

関連するQ&A

  • エクセルVBAで読み取りパスワード回避

    エクセル2010です。 以下のコードで任意のフォルダ内のエクセルBOOKから所定のデータを取得できます。 しかし、指定フォルダ内に読み取りパスワードが設定されたものがあると、開くことができずに止まってしまいます。 読み取りパスワードが同一で、事前に分かっていればコードにPassword:="AAAABBBB" などと書き入れればいいと思うのですが、事前にはわかりませんし、パスワードもそれぞれ異なります。 そこで、開けなかった場合には、そのBOOKを飛ばしてすすみ、別シートに飛ばしたBOOK名を記録しておきたいのです。 (BOOK作成者にあとからパスワードを聞くため) しかし、残念ながらどのように書けばいいのか思いつきません。 ご指導いただければ幸いです。 Sub TEST001()   Dim wb(1) As Workbook   Dim ws(1) As Worksheet   Dim myFdr As String, fn As String   Dim i As Long   With Application.FileDialog(msoFileDialogFolderPicker) 'フォルダ指定     If .Show = True Then        myFdr = .SelectedItems(1)     Else       Exit Sub     End If   End With   Application.ScreenUpdating = False '画面更新を一時停止   Set wb(0) = ThisWorkbook 'このコピー先ブックをwb(0)とする。   Set ws(0) = wb(0).Sheets(1) 'wb(0)の1枚目のシートをws(0)とする。   fn = Dir(myFdr & "\*.xls*") 'フォルダ内のExcelブックを検索   Do Until fn = Empty '全て検索     Application.EnableEvents = False     Set wb(1) = Workbooks.Open(myFdr & "\" & fn, UpdateLinks:=False, ReadOnly:=True) 'そのブックを開きwb(1)とする。     Set ws(1) = wb(1).Worksheets(1)     i = i + 1     ws(0).Cells(i, "A").Value = ws(1).Range("B2") 'ws(0)に転記     ws(0).Cells(i, "B").Value = wb(1).Name     ws(0).Cells(i, "C").Value = ws(1).Name     wb(1).Close (False) '保存せず閉じる     Application.EnableEvents = True     fn = Dir 'フォルダ内の次のExcelブックを検索   Loop '繰り返す   Application.ScreenUpdating = True '画面更新停止を解除   MsgBox i & "個取得" End Sub

  • エクセルVBAでファイル保存失敗の原因?

    エクセル2010です。 Sheets("DATA")にある822件のデータを、D列のデータ(担当者名)をキーにフィルター抽出し、雛形のシートにコピーして、そのシートを別ファイルとして名前をつけて、指定したフォルダーのサブフォルダに保存するマクロです。(サブフォルダ名はデータのG列にある文字列です。) キーとなる担当の数は223です。 以下のコードで一応作動するのですが、同じデータを使っても2回に一回くらいの割合で保存ができず、 wb(1).SaveAs Filename:=SaveDir & "\" & bcde & "_" & Trim(myC.Value) & ".xlsx" のところで止まってしまいます。 エラーは 「実行時エラー1004 SaveAsメソッドは失敗しました。Workbookオブジェクト」 というものです。このとき、画面上ではあたらしいファイルが出来あがっております。しかしその出来てるファイルを手動で保存しようと思っても、 「○○○(ファイル名)は保存中にエラーが検出されました。いくつかの機能を削除または修復することによりファイルを保存できる場合があります」 とでてしまいます。 まだテスト段階で、同一のデータでテストしているのですが、止まるデータは30件目であったり、140件目であったり、まちまちです。2回に1回くらいは最後まで動き、すべて正しく作成され保存できているので、データの問題ではないと思います。 ほかにどんな問題が考えられるのでしょうか?とても困っています。 Sub TEST20151114()   Dim SaveDir As String, bcde As String, sbfdr As String   Dim wb(1) As Workbook   Dim i As Long, x As Long   Dim myRng As Range, myC As Range   Dim t      t = Time      Set wb(0) = ThisWorkbook   Set myRng = wb(0).Sheets("担当別").Range("B2:B224")   Application.ScreenUpdating = False   For Each myC In myRng     wb(0).Sheets("回答雛型").Copy After:=wb(0).Sheets("回答雛型")     wb(0).Sheets("回答雛型 (2)").Name = "回答シート"     With wb(0).Sheets("DATA")       .AutoFilterMode = False       .Range("A1:J1").AutoFilter       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value 'D列       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Sheets("回答シート").Range("A2")       .ShowAllData       x = wb(0).Sheets("回答シート").Cells(Rows.Count, "A").End(xlUp).Row       .Range("A823:J827").Copy wb(0).Sheets("回答シート").Range("A" & x + 1) '予備5行追加     End With          With wb(0).Sheets("回答シート")       .Rows(x + 6 & ":" & .Rows.Count).Delete Shift:=xlUp       Application.Goto Reference:=.Range("A1"), Scroll:=True       bcde = CStr(Trim(.Range("E2").Value))       sbfdr = Trim(.Range("G2").Value) 'サブフォルダ名              .Move     End With          Set wb(1) = ActiveWorkbook          SaveDir = wb(0).Path & "\20151114\" & sbfdr '保存先     If Dir(SaveDir, vbDirectory) = "" Then       MkDir SaveDir '無ければサブフォルダ作成     End If          DoEvents          wb(1).SaveAs Filename:=SaveDir & "\" & bcde & "_" & Trim(myC.Value) & ".xlsx"     wb(1).Close (False)     myC.Offset(, 1).Value = x - 1          i = i + 1     Application.StatusBar = i & "/" & myC.Value     Set wb(1) = Nothing   Next myC      Set wb(0) = Nothing   Application.ScreenUpdating = True   MsgBox i & "個のファイルを作成しました。" & vbCrLf & Format(Time - t, "hh:mm:ss")   Application.StatusBar = "" End Sub

  • エクセルVBA フォルダ内のどんなシート名であっても読み込みたい

    フォルダ内の別ブック(D3で指定)の「情報」シートを読み込んで対象年月日に該当するデータを抽出して別ブックに貼り付けるものなんですが、下のコードではSet ws = wb.Worksheets("情報")と、なっていて、限定しているのですが、これをD3のファイルのどんなシート名であっても読み込みたいのですが、どのようにコードにしたらいいでしょうか?D3で指定するブックには必ずひとつのシートしかありません。 よろしくお願いします。 Sub test_1() Dim wb As Workbook Dim ws As Worksheet Dim ms As Worksheet Dim nb As Workbook Dim r As Long Set ms = ThisWorkbook.Worksheets("メニュー") Set wb = Workbooks.Open(ms.Parent.Path & "\" & ms.Range("D3").Value) Set ws = wb.Worksheets("情報") Set nb = Workbooks.Add With ws .Range("Q1").AutoFilter _ Field:=17, _ Criteria1:=">=" & ms.Range("D5").Text, _ Operator:=xlAnd, _ Criteria2:="<=" & ms.Range("F5").Text With .AutoFilter.Range r = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count If r = 1 Then MsgBox "抽出対象データ無し。" wb.Close False nb.Close False Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing Exit Sub End If .Copy End With End With With nb.Worksheets(1) .Paste With .Range("A1:AG1") .Interior.ColorIndex = 6 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With End sub

  • エクセルVBAでつまずいています

    教えてください。以前別のブックから、抽出条件を指定して、 項目を追加して、ある条件を検査して、それによって追加した項目の列 に対応する値を書き込むというコードを教えていただきました。 質問は、今現在、 With .Range("AH2").Resize(r - 1, 1) .FormulaR1C1 = _ "=IF(RC[-25]=""AAA"",""aaa""," & _ "IF(RC[-25]=""BBB"",""bbb""," & _ "IF(RC[-25]=""CCC"",""ccc""," & _ "IF(RC[-25]=""DDD"",""ddd"",""xxx"") の部分で、関数を設定していますが、AIの列にも同じように関数 (VLOOKUP)を設定したいのですが、Resize(r - 1, 1)の意味するところが しっかり理解していないためできません。 A1形式ですが、例えば、 参照先がD2、A2:J100として =VLOOKUP(D2,A2:J100,5,FASE) =VLOOKUP(D2,A2:J100,6,FASE) =VLOOKUP(D2,A2:J100,7,FASE) という条件を追加したいのですが、わかりませんでした。 どのようにしたらいいでしょうか。よろしくお願いします。 Sub test() Dim wb As Workbook Dim ws As Worksheet Dim ms As Worksheet Dim nb As Workbook Dim r As Long Set ms = ThisWorkbook.Worksheets("条件入力") Set wb = Workbooks.Open(ms.Parent.Path & "\" & ms.Range("D3").Value) Set ws = wb.Worksheets("元データ") Set nb = Workbooks.Add With ws .Range("Q1").AutoFilter _ Field:=17, _ Criteria1:=">=" & ms.Range("D5").Text, _ Operator:=xlAnd, _ Criteria2:="<=" & ms.Range("F5").Text With .AutoFilter.Range r = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count If r = 1 Then MsgBox "抽出対象データ無し。" wb.Close False nb.Close False Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing Exit Sub End If .Copy End With End With With nb.Worksheets(1) .Paste With .Range("A1:AG1") .Interior.ColorIndex = 6 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With .Range("AH1").Value = "追加項目A" .Range("AI1").Value = "追加項目B" .Range("AJ1").Value = "追加項目C" .Range("AK1").Value = "追加項目D" With .Range("AH2").Resize(r - 1, 1) .FormulaR1C1 = _ "=IF(RC[-25]=""AAA"",""aaa""," & _ "IF(RC[-25]=""BBB"",""bbb""," & _ "IF(RC[-25]=""CCC"",""ccc""," & _ "IF(RC[-25]=""DDD"",""ddd"",""xxx"") End With End With nb.SaveAs _ Filename:=ms.Parent.Path & "\" & _ Replace(wb.Name, ".xls", "") & "更新データ.xls" wb.Close False nb.Close Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing End With End Sub

  • エクセルVBAのグラフに関することです!助けてください!

    先日にも質問させていただいているのですが、ブック内のシート全てにグラフがあります。そのグラフの大きさを統一したいのですが、初心者でなかなかうまくいかず、どこをどのようにかえたらいいかもわかりません。サイトをみて参考に作ってみたマクロでは、一枚のシートだけうまく表示されてしまいます。私のような素人にどなたか教えていただけないでしょうか。。たいへん困っています。 Sub グラフ1() Dim ws As Variant Const MYRNG As String = ("a11:a58,d11:g58") 'データ範囲 For Each ws In ActiveWorkbook.Worksheets Charts.Add With ActiveChart .ChartType = xlXYScatterLines .SetSourceData Source:=ws.Range(MYRNG), _ PlotBy:=xlColumns .Location Where:=xlLocationAsObject, Name:=ws.Name End With With ActiveChart.PlotArea '仕切りなおし With .Border .ColorIndex = 16 .Weight = xlThin .LineStyle = xlContinuous End With .Interior.ColorIndex = xlNone End With Next ws End Sub

  • ExcelのVBAについてです。シート1と2を作成

    ExcelのVBAについてです。シート1と2を作成し、シート1にバーコードまたはキーボードで入力します。シート1は入力専用かつ入力した分の早見表で、実際にはシート2に転記仕訳して、シート3以降に表を作成したいです。使い方はシート1に入力またはシート2をタップまたはクリックすると入力(画面)になります。以前の質問の回答を参考に必要最低限に改良しています。パッと見で構いません、何か不具合は見付からないでしょうか? '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Dim st1, s, i3 As Long Dim Bst As Range Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 st1 = ws1.Cells(Rows.Count, "E").End(xlUp).Row 'A列の最終行を設定する s = 3 For i3 = 3 To st1 Set Bst = ws2.Columns("E").Find(What:=ws1.Cells(i3, "E"), LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) シート間のE列を比較 If Bst Is Nothing Then '比較して無い場合は、下記を実行 ws1.Cells(s, "A") = ws1.Cells(i3, "A") '追加する文字を転記する。(コード) s = s + 1 End If Next i3 Next i '(1)シートを変数にセット Dim ws1_ As Worksheet Set ws1_ = Worksheets("Sheet1") ws1_.Activate End Sub

  • VBAで分割したBOOKが元データより大きい?!

    Sheets("DATA")とSheets("店舗一覧").の2枚のシートのBOOKがあります。 Sheets("DATA")は1行目は空白、2行目がタイトル行で3行目からがデータです。 配置は、A列が日付け(シリアル値)、B列が店舗名(文字)、C列が店舗コード(010~050)、DからM列までは数値、行数は2000程度のデータが日付け順に入っています。 Sheets("店舗一覧")にはA列に店舗名が50行あるだけです。 このデータを、B列の店舗名ごとにそれぞれ別のBOOKに切り分けようと下記のようなマクロを書きました。 ところが出来上がったBOOKをみるとなんとそれぞれが2054KBもあるのです。 元データのマクロがあるBOOKのサイズは、全データが入っていても251KBしかないのに、店ごとに切りわけたBOOKが2054KBとは腑に落ちません。 いったい何がおきたのでしょう?エクセル2000、Windows2000です。 Sub 分割TEST() Dim c As Range Dim ws As Worksheet, wb As Workbook Dim x As Long, t As Single Sheets("DATA").Range("A2:M2").AutoFilter For Each c In Sheets("店舗一覧").Range("A1:A50") Sheets.Add Set ws = ActiveSheet With Sheets("DATA") .Range("A2").AutoFilter Field:=2, Criteria1:=c.Value .Cells.Copy ws.Cells(1, 1) End With With ws .Name = c.Value .Move Set wb = ActiveWorkbook With wb .SaveAs Filename:=ThisWorkbook.Path & "\" & c.Value & ".xls" .Close (True) End With End With Sheets("DATA").AutoFilterMode = False Next c End Sub

  • エクセルで複数のブックの一部を抽出する

    エクセルで複数のブックの一部をBOOK1に1行ずつコピーしたいんですが、いろいろ探して近いものは見つけたのですが、元になるブックの1部の列をコピーするブックの行にコピー出来ないでしょうか? merlionXXさんのhttp://oshiete1.goo.ne.jp/qa4969413.htmlこれを参考にして作っているのですが、 課名D16 商品名B20:B39 枚数H20:H39 金額I20:I39 の部分をbook1に1件1行としてコピーしたいのですができますでしょうか? もとのブックの行数は決まっています。 どうか力を貸してください。よろしくお願いします。 Sub test02() Dim MyFile As String, MyPath As String '変数宣言 Dim x As Long, y As Long Dim wb As Workbook, tb As Workbook Dim ka As String Dim sh1, sh2 Set tb = ThisWorkbook MyPath = tb.Path & "\" '自分のパスを取得 MyFile = Dir(MyPath & "*.xls", vbNormal) 'パス内のエクセルファイル Application.ScreenUpdating = False '画面更新停止 Application.Calculation = xlCalculationManual '自動計算停止 Do While MyFile <> "" 'エクセルファイルがなくなるまで If MyFile <> tb.Name Then '自分以外のファイルを対象 Set wb = Workbooks.Open(MyPath & MyFile) '選択したファイルを開く With ActiveSheet ka = .Range("D16").Value '課名取得 x = .Range("B" & Rows.Count).End(xlUp).Row '最終行取得 sh1 = .Range("B20:B" & x).Value '商品名取得 sh2 = .Range("H20:I" & x).Value '数量&金額取得 End With With tb.Sheets("Sheet1") y = .Range("B" & Rows.Count).End(xlUp).Row '最終行取得 y = IIf(.Range("B" & y) = "", y, y + 1) If x >= 20 Then '納品書B20以下にデータがあれば Set myRng = .Range("A" & y).Resize(x - 19, 1) myRng.Value = ka '課名転記 myRng.Offset(, 1).Value = sh1 '商品名転記 myRng.Offset(, 2).Resize(, 2).Value = sh2 '数量&金額転記 End If End With wb.Close (False) '選択したファイルを閉じる End If MyFile = Dir() '次のファイルを検索 Loop '繰り返し Application.Calculation = xlCalculationAutomatic '自動計算停止解除 Application.ScreenUpdating = True '画面更新停止解除 Set tb = Nothing Set wb = Nothing Set myRng = Nothing End Sub

  • VBA 別ブックへのデータ転記

    別ブックへのデータの転記についてご教示お願いいたします。 以下、やりたいことです。 Bookの構成4種類 1.抽出用 (csvデータをコピーして、転記用Bookに移す為の加工をしており、A列に〇がついたものでO列の値(1~3)別にそれぞれのBookへ転記しようと考えています。 2.転記O列1用 3.転記O列2用 4.転記O列3用 現在のコードは以下の通りで、わからない点は大まかに2点あります。 1点目は、O列の値(1~3)の値を見てBookを開く(現在は指定のBookを開くコードになっています) 2点目は、転記用への転記の方法 例えば、抽出用のA2とA4に〇がついてO列が共に1だとすると、転記O列1用のBookを開いて、 A2のデータを以下のように。 抽出用   転記O列1用 P列の値 → A7へ C列の値 → A8へ H列の値 → A9へ I列の値 → A10へ F列の値 → E5へ L列の値 → D6へ M列の値 → D7へ K列の値 → F9へ J列の値 → D8へ A4のデータを以下のように。 抽出用  転記O列1用 P列の値 → A12へ C列の値 → A13へ H列の値 → A14へ I列の値 → A15へ F列の値 → E10へ L列の値 → D11へ M列の値 → D12へ K列の値 → F14へ J列の値 → D13へ 以上のような事がしたいのですが、 現在、勉強中の初心者で…参考書を見ながら以下のコードまでしか出来ませんでした。 このコードもめちゃくちゃなのかもしれないのでお恥ずかしいのですが… なんとかこのデータを仕上げたいと思っています。 ご教示よろしくお願いいたします。 Sub ボタン2_Click() Dim myCnc1 As String Dim myCnc2 As String Dim myFileName As String Dim sheet1 As Worksheet myFileName = "受注.csv" Set sheet1 = Worksheets(2) sheet1.Activate myCnc1 = "TEXT;" myCnc2 = ThisWorkbook.Path & "\" & myFileName With ActiveSheet.QueryTables.Add( _ Connection:=myCnc1 & myCnc2, _ Destination:=Range("A1")) .TextFilePlatform = 932 .TextFileCommaDelimiter = True .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1) .Refresh End With Columns("A:A").Insert Columns("B:B").Select Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _ FieldInfo:=Array(1, 5) Columns("G:G").Select Selection.TextToColumns Destination:=Range("G1"), DataType:=xlDelimited, _ FieldInfo:=Array(1, 5) Columns("O:O").Select Selection.TextToColumns Destination:=Range("O1"), DataType:=xlDelimited, _ FieldInfo:=Array(1, 5) Dim r As Long r = Range("E" & Rows.Count).End(xlUp).Row Columns("E:E").Insert Range("E2:E" & r).FormulaR1C1 = "=LEFT(RC[-1],10)" Range("E2:E" & r).Value = Range("E2:E" & r).Value Range("D1").Copy Range("E1") Columns("D:D").Delete Columns("H:H").NumberFormatLocal = "0_ " Columns("O:O").Insert Range("O2:O" & r).FormulaR1C1 = "=Right(RC[-1],3)" Range("O2:O" & r).Value = Range("O2:O" & r).Value Range("N1").Copy Range("O1") Range("O1") = Range("N1") + "2" Range("A1").Select Dim myRng1 As Range Dim myRng2 As Range Dim mySht As Worksheet Set myRng1 = _ ActiveSheet.Range("c1").CurrentRegion With myRng1 .AutoFilter Field:=3, Criteria1:="=J*" Set myRng2 = .SpecialCells(xlCellTypeVisible) .AutoFilter myRng2.EntireRow.Hidden = True On Error Resume Next .SpecialCells(xlCellTypeVisible).EntireRow.Delete On Error GoTo 0 myRng2.EntireRow.Hidden = False End With Set myRng1 = Nothing Set myRng2 = Nothing myFileName = ThisWorkbook.Path & "\転記O列1用.xlsm" Workbooks.Open Filename:=myFileName End Sub

  • ActiveWorkbook.SaveAsが失敗

    Excel2010です。 以下はdataシートからtestシートに値をコピーし、testシートを別ファイルとして保存させるだけの単純なVBAです。 Sub TEST01()   Dim wb As Workbook   Dim ws As Worksheet, ns As Worksheet   Dim myC As Range   Dim n As Long      Set wb = ThisWorkbook   Set ws = wb.Worksheets("test")      With wb.Sheets("data")     For Each myC In .Range("A1", .Range("A1").End(xlDown))       wb.Activate       ws.Range("A1:C1").Value = myC.Resize(1, 3).Value       n = n + 1       ws.Copy       Set ns = ActiveSheet       ns.Name = "test" & Format(Date, "YYYYMMDD")       Call ファイル作成(ns)     Next   End With   ws.Select   MsgBox n & " 件の作業を終了しました。" End Sub Sub ファイル作成(ByRef ns As Worksheet)   Dim Fdr As String, Fn As String   Dim myStr As String      With ns     .Activate     .Buttons.Delete     Fdr = ThisWorkbook.Path & "\" & Format(Date, "YYYYMMDD" & "作成分") '保存先     If Dir(Fdr, vbDirectory) = "" Then        MkDir Fdr '無ければ作成     End If     DoEvents     myStr = IIf(Trim(.Range("C1").Value) = "", "", "-" & Trim(.Range("C1").Value))     Fn = .Range("A1").Value & "_" & .Range("B1").Value & myStr & ".xlsx"  '     Application.StatusBar = Fn & " ファイル作成中"     ActiveWorkbook.SaveAs Filename:=Fdr & "\" & Fn     ActiveWorkbook.Close (False)   End With   Application.StatusBar = "" End Sub 自分の端末内で動かして問題なく作動します。 ところがネットワークでつながった会社のサーバー内の、部門内共有フォルダーに保存して実行すると1番目のデータは問題なく動き、ちゃんとファイルも保存されるのですが2番目でActiveWorkbook.SaveAsのところで実行時エラーがでます。 個人の端末ではちゃんと作動するのでデータのせいではないとは思いつつ、別のデータにしてみてもやはり2番目は同じエラーが出ます。 ファイル保存するシートにはそのシート内を参照する数式があるだけで、ボタン以外のオブジェクトはありません。(ボタンも保存前にDeleteしてます) 何が原因で端末ならOKのものが共有フォルダーでだめなのかまったくわかりません。どなたかお知恵をおかしください。

専門家に質問してみよう