• ベストアンサー

Excel VBAの実行中に実行を中断して通常のエクセル作業を入れたい。

Excel VBAの実行中に実行を中断して通常のエクセル作業を入れる方法を教えてください。 1.Application.GetOpenFilenameで選択してワークブックを開く。 2.そのワークブックのシートの中から目的とするシートを選択する。 3.選択したシートを新しいワークブックにコピーする。 4.開いたワークブックを閉じる。 という一連の作業の中で、2.については通常のエクセルの作業のようにシートを一枚ずつ確認して選択する必要があります。 現在、stopを使って強引に中断させているのですが、何か良い方法はありますでしょうか? よろしくお願いします。 ちなみに、今、私が作っているのプロシージャーは下記のようなものです。 Private QUOTfile As String Private filename As String Sub QUOTfileOpen() QUOTfile = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If QUOTfile <> "False" Then Workbooks.Open QUOTfile End If filename = ActiveWorkbook.Name Stop ActiveSheet.Copy With Application .Dialogs(xlDialogSaveWorkbook).Show End With Workbooks(filename).Close saveChanges:=False End Sub

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 キャプチャーツールなんかで良く見かけるイメージで。待機時間の カウントダウンをステータスバーに表示させてます。 Private Declare Function timeGetTime Lib "winmm.dll" () As Long Sub Sample()      Const INTERVAL As Long = 10000 ' // 単位ミリ秒-10秒間      Dim vFilename As Variant   Dim wb     As Workbook   Dim lTimeout  As Long   Dim lRefresh  As Long   Dim iRes    As Integer   Dim fContinue As Boolean      vFilename = Application.GetOpenFilename( _         FileFilter:="Microsoft Excelブック(*.xls),*.xls", _         Title:="ブックを開いた後に目的のシートを" & _             CStr(Int(INTERVAL / 1000)) & "秒以内で選択")   If VarType(vFilename) = vbBoolean Then     Exit Sub   End If   Set wb = Workbooks.Open(filename:=vFilename)      fContinue = False   Do While Not fContinue     Application.StatusBar = "Waiting..." & CStr(Int(INTERVAL / 1000)) & "sec"     lTimeout = timeGetTime() + INTERVAL     lRefresh = timeGetTime()     While lTimeout > timeGetTime()       ' // ステータスバー更新間隔 0.2秒(チラつかない程度で適当)       If timeGetTime() - lRefresh >= 200 Then         Application.StatusBar = "Waiting..." & _                     CStr(Int((lTimeout - timeGetTime()) / 1000) + 1) & _                     "sec"         lRefresh = timeGetTime()       End If       DoEvents     Wend     Application.StatusBar = "Waiting...0sec"     iRes = MsgBox("[は い]    次の処理を続行します" & vbLf & _            "[いいえ]    シートを選択し直します" & vbLf & _            "[キャンセル] 処理中止", _            vbYesNoCancel Or vbDefaultButton2 Or vbInformation, _            "選択できましたか?")     Select Case iRes       Case vbYes:   fContinue = True: Exit Do       Case vbCancel: Exit Do     End Select   Loop      Application.StatusBar = ""   If fContinue Then     wb.Windows(1).SelectedSheets.Copy     Application.Dialogs(xlDialogSaveWorkbook).Show   End If      wb.Close SaveChanges:=False   Set wb = Nothing End Sub

sasakimari
質問者

お礼

ありがとうございました。 コピペして思ったように処理できました。 これと似たケースで途中でexcel作業を入れたいものが幾つかありましたので、それにも応用できるので大変助かりました。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

一定時間経過後に続行でよければOnTimeメソッドなどでも可能ですが、作業の性格からそのような設定ではうまくいかないと推測されます。 現状で、マクロの実行のきっかけをどのようにしているのか不明ですが(ボタン登録やコマンド登録かな?)、続行する際に、多分、続行の指示をしていますよね? ということはマクロの実行を指示するのと同じなので、一番簡単なのは前半と後半のルーチンを分割しておいて、マクロを呼び出せば良いのでは?(無理に一つのサブルーチンにする必要がないと思われます) 例えばボタン登録を利用する場合を例にすれば、前半の実行ボタンと後半の実行ボタンを用意しておいて、それぞれのマクロを登録しておく。 どうしても一つのマクロにしたければ(その理由は不明ですが)、マクロを呼び出すごとに前半と後半を交互に実行するようなサブルーチンにしておくことでしょうか。(実際にはこちらの方が使いにくいと思います。誤操作も起き易いでしょうし。) <交互に実行する構造のサンプル> Sub test() Static flag As Boolean  flag = Not flag  If flag Then   'First  --前半の処理を記載(又はSub呼び出し)  Else   'Second --後半の処理を記載(又はSub呼び出し)  End If End Sub

sasakimari
質問者

お礼

ありがとうございました。

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

こんにちは。 >filename = ActiveWorkbook.Name >Stop >ActiveSheet.Copy その、インターラプトはまずいですね。 >2.については通常のエクセルの作業のようにシートを一枚ずつ確認して選択する必要があります。 確かに、対話型のInputBox メソッドでは思ったようにはいきませんので、 UserForm のモードのShowModal を、False (または、起動で、UserForm.Show 0 とする) として、 '標準モジュール '--------------------------------- Public filename As String Sub QUOTfileOpen() Dim QUOTfile As String   QUOTfile = Application.GetOpenFilename("Microsoft Excelブック,*.xls")   If StrComp(QUOTfile, "False", 1) <> 0 Then     Workbooks.Open QUOTfile   Else     Exit Sub   End If   filename = ActiveWorkbook.Name   UserForm1.Show 0    End Sub 'UserForm 'UserForm モジュール '--------------------------------- Private Sub CommandButton1_Click() Dim s As Variant  'シートの複数選択が可能  For Each s In ActiveWindow.SelectedSheets   s.Copy   With Application    .Dialogs(xlDialogSaveWorkbook).Show    ActiveWorkbook.Close False   End With  Next  Workbooks(filename).Close False  Unload Me End Sub Private Sub UserForm_Initialize()  Workbooks(filename).Activate End Sub

sasakimari
質問者

お礼

ありがとうございました。 Userformはこれまで使った事が無いので勉強になりました。今後userformも使ってみようと思います。

関連するQ&A

  • VBAで質問です

    下記のVBAを作成しました。 ダイアログからtxtファイルをエクセルで開きます。 ここで作成されたシートを別のブックの「ログ」というシートに貼り付けたいのです。 宜しくお願いします。 ・txtファイルは日付が入る為、毎回違う名前になります。 ・ Private Sub CommandButton4_Click() Dim fname As String fname = Application.GetOpenFilename( _ filefilter:="Excelファイル,*.xls,すべてのファイル,*.*") If fname = "false" Then Exit Sub Workbooks.OpenText Filename:=fname

  • エクセルで繰り返し同じ作業をしたい

    仕事でDドライブの中のフォルダにエクセルのシートが100種類位入っています。それらのエクセルシートに毎日同じ作業をしなければならないのですが、(エクセルを開いて行う作業は各シート共通です)そのマクロの作り方を教えていただけないでしょうか?ちなみに Workbooks.Open Filename:="D:\業務\あ.xls" Range("D9").Select Selection.Copy Range("E9").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close Workbooks.Open Filename:="D:\業務\い.xls" Range("D9").Select Selection.Copy Range("E9").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close Workbooks.Open Filename:="D:\業務\う.xls" Range("D9").Select Selection.Copy Range("E9").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close      その後もまだまだ続きます。 というマクロの記録を使って作ってはいるものの、やたらと長くなってしまいます。VBAの知識がない初心者なのですが、いい方法があれば教えていただけないでしょうか?

  • excel 2003でCSVファイルを読み込むVBA

    現在CSVファイルを読み込むマクロを作成してますが、レベルが低く下記載のコードで作業を行ってます。 皆様の技術をお借りしたいので、ご教授宜しくお願い致します。 ※現在のコードです。 CommandButton1でフォルダーを開いてcsvファイルを選択し、toolをsheetに追加してます。それから、CommandButton3で追加されたtoolからB14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付けています。 結構手間が係り作業に時間がかかってしまいます。 そこで、改良をしたいと思いますのでご教授お願い致します。 ※改良したいポイント (1)同じフォルダー内のTOOL.CSVをフォルダーを開かず直接commandButton1でSheetに追加する。 (2)Sheet2にコピーされたデーターから(B14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付ける。 (commandButton3はなくしたいと思ってます) 以上です。 宜しくお願い致します。 --------------------------------------------------------- Private Sub CommandButton1_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Myname = ActiveWorkbook.Name CSV_Filename = Application.GetOpenFilename("CSVファイル(*.CSV;*.prn),*.CSV;*.prn", , "CSVファイルを開く") If CSV_Filename = False Then Exit Sub Workbooks.Open CSV_Filename CSV_SheetName = Worksheets(1).Name Sheets(CSV_SheetName).Move after:=Workbooks(Myname).Sheets(Sheets.Count + 1) Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub ---------------------------------------------------------------- Private Sub CommandButton3_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Sheets("(TOOL)").Select Sheets("(TOOL)").Range("B14:C14").Select Sheets("(TOOL)").Range(Selection, Selection.End(xlDown)).Select Selection.copy Sheets("CSV Road").Select Sheets("CSV Road").Range("B12").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub -------------------------------------------------------------

  • Excel VBAについて

    Excelのシートにコマンドボタンを配置して、そのコマンドボタンをクリックすると「ファイルを開く」のダイアログボックスを表示したいと思っています。 そのとき、デフォルトでファイルの場所は「D:\Test」にしたいのですが、どうしたらよいのでしょうか。 ユーザは、ファイルの場所を探さずに、コマンドボタンをクリックしたら開きたいファイル名を指定するだけでいいようにしたいのですが。 下記では、ファイルを開くダイアログは表示されるのですが、ファイルの場所を毎回探さなくてはいけません。 どなたかご教授下さい。 Private Sub Cmd_ファイル選択_Click() Dim FileName As Variant FileName=Application.GetOpenFileName("Microsoft Excelブック,*.xls") Workbooks.Open OpenFileName End Sub

  • エクセルVBA ブック間のコピー

    選択したテキストファイルをエクセルで開いたコピーし、 もう一つ開いたエクセルファイルにペーストするというマクロをVBAで 作成していますが、つまずいてしまいました。 ----------------------------------- Dim wb1 As String Dim wb2 As String Sub Opentxt() wb1 = Application.GetOpenFilename("テキストファイル,*.txt") If wb1 <> "False" Then Workbooks.OpenText Filename:=wb1, DataType:=xlDelimited, comma:=True End If End Sub Sub Copy() Dim LastRow As Long wb2 = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") If wb2 <> "False" Then Workbooks.Open wb2 LastRow = wb2.Sheets("一覧表").Range("A" & Rows.Count). End(xlUp).Row wb2.Sheets("一覧表").Range("A5:A" & lastRow).Copy _ wb1.Sheets("Sheet1).Range("B33") End If End Sub ----------------------------------- Opentxtの方は問題ないですが、Copyの方を実行すると wb1とwb2で引っかかって「コンパイルエラー/ 修飾子が不正です」と 表示されて、エラーになってしまいます。 この場合変数の型などがおかしいのでしょうか? excel2007を使用しています。 よろしくお願いします。

  • Excel VBA 違うxlsファイルの指定したシートを開く処理

    Excel VBAで違うExcelファイルの指定したシートを開きたいのですが、 うまくいきません。現在のコードは、 *フォーム* Private Sub CB1_Click() Dim A As Integer A = MsgBox("データ展開する?", 4, "データ展開?") If A = 6 Then INPORT.FILE_OPEN1 End If End Sub *INPORTモジュール* Sub FILE_OPEN1()  FILE_OPEN8 End Sub Sub FILE_OPEN8() Dim fnames As String fnames = fnames1 Workbooks.Open Filename:=fnames ***ここでしょうか?.Sheet("")と指定しても出来ません*** End Sub Function fnames1() As Variant fnames1 = Application.GetOpenFilename( _ Title:="ファイルを開く", _ FILEFILTER:="エクセルファイル (*.xls), *.xls") If fnames1 = False Then MsgBox ("ファイルを開けませんでした。" & Chr$(13) & _ "もう一度やり直して下さい。") End End If End Function また、指定する事が出来たら、選択したシートを現在のブックにコピーもしたいのですが、どの様にすればよいでしょうか? よろしくお願いします。

  • エクセルVBAのコンパイルエラー

    下記VBAでコンパイルエラーを起こして進みません 解消法をご教授いただけると幸いです やりたいこととしては ボタンで任意のタブ区切りのテキストを指定し 特定のシートに値をコピーすることです ---- Private Sub CommandButton1_Click() Dim Sh As Worksheet Dim FileN As String Set Sh = ThisWorkbook.Sheets("import") ' <-- 読込みシート指定(※) FileN = Application.GetOpenFilename("テキストファイル,*.txt") If FileN <> "False" Then Workbooks.OpenText Filename:=FileN, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Tab:=True End If Set Sh = Nothing End Sub ----

  • VBAを実行するとエクセルが落ちる

    同一フォルダ内にあるCSVデータを一つのエクセルにワークブックにまとめるため CSVデータを開いて、各シートに値を貼り付けるVBAを作成しました デバックモードで1行毎に実行するとエクセルが落ちることはありませんが 普通に実行するとエクセルが閉じてしまいます 原因が分からないためご指摘いただけると幸いです Win7のOffice2013です。 Sub contents() Sheets("01").Select Sheets("01").Cells.Select Selection.ClearContents Dim ShA As Worksheet Dim FileA As String Set ShA = ThisWorkbook.Sheets("01") ChDir "C:\Users\Public\Documents" FileA = "C:\Users\Public\Documents\01.csv" If FileA <> "False" Then Workbooks.OpenText Filename:=FileA, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShA.Range("A1") ActiveWorkbook.Close False End If Set ShA = Nothing Sheets("02").Select Sheets("02").Cells.Select Selection.ClearContents Dim ShB As Worksheet Dim FileB As String Set ShB = ThisWorkbook.Sheets("02") ChDir "C:\Users\Public\Documents" FileB = "C:\Users\Public\Documents\02.csv" If FileB <> "False" Then Workbooks.OpenText Filename:=FileB, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShB.Range("A1") ActiveWorkbook.Close False End If Set ShB = Nothing Sheets("03").Select Sheets("03").Cells.Select Selection.ClearContents Dim ShC As Worksheet Dim FileC As String Set ShC = ThisWorkbook.Sheets("03") ChDir "C:\Users\Public\Documents" FileC = "C:\Users\Public\Documents\03.csv" If FileC <> "False" Then Workbooks.OpenText Filename:=FileC, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShC.Range("A1") ActiveWorkbook.Close False End If Set ShC = Nothing End Sub

  • Excel VBA連続コピー、貼付処理について

    特定のフォルダ内に格納されている複数のExcelファイルの「sheet1」シートのデータを 所定のExcelファイルにコピー&ペーストしたいのですが、うまくいきません。 (貼付先のファイルを閉じようとするとエラーが発生します。) どうすればできるようになるでしょうか? ご教授の程よろしくお願いいたします。 -------------------------------------------------------------------- Sub copy_test() Dim myPath As String Dim copyFile As String Dim pasteFile As String Dim n As Long myPath = "C:\copy\" copyFile = Dir(myPath & "*.xls*") pasteFile = "C:\paste\paste_data.xlsx" n = 2 Do Until copyFile = "" Workbooks.Open Filename:=myPath & copyFile Workbooks(copyFile).Worksheets("sheet1").Range("A2:L201").Copy Workbooks.Open Filename:=pasteFile 'Workbooks(pasteFile).Worksheets("paste_data").Active Range("B1").Select Selection.End(xlDown).Select Selection.End(xlToLeft).Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveWorkbook.Save Workbooks(pasteFile).Close False Application.CutCopyMode = False Workbooks(copyFile).Close False n = n + 999 copyFile = Dir() Loop End Sub ---------------------------------------------------------------------------------

  • エクセルVBAでの呼出操作をマクロ化するには?

    エクセルVBAでの呼出操作をマクロ化するには? 【今年の7/16に以下の質問をしました】 エクセル2000です。宜しくお願いします。 VBAで、ファイルを呼び出したいのですが、Workbooks.openの書き方が良く分かりません。 呼び出すファイル名は決まっていなくて、フォルダ名は固定です。 エクセルの操作で言うと、ファイルを開くを押して、フォルダを選ぶとこまでをマクロかしたいのですが。 例えば、ドライブDの「作業用」フォルダを開きたい場合は、どう記述すれば宜しいでしょうか? 基礎的な部分でお恥ずかしいのですが、以下で実行しても動かんのです。 ChDir "D:\作業用" Workbooks.OpenText Filename:= "D:\作業用\*.*" 【watabe007 さんより以下の回答を頂きまして当時は上手く動いたつもりだったのですが、  添付画像の様にファイルの種類が「すべてのファイル(*.*)」しかありません。】 Dim strRet As String ChDrive "D:\作業用" ChDir "D:\作業用" strRet = Application.GetOpenFilename(Title:="ファイル名を選択して下さい") If strRet = "False" Then   MsgBox "キャンセルが選択されました。処理を中止します。", vbCritical   Exit Sub Else   Workbooks.Open Filename:=strRet End If End Sub 【今回の再質問】  当時ファイルの種類まで指定していなかったのですが、実際には、テキストデータを、カンマ区切り  で変換して呼び出したいので、ファイルの種類は、「テキストファイル」としたいのですが、  どうすれば宜しいでしょうか?  助けてください。  (上記のような事は無理なんでしょうか?無理なら無理のご回答がご投稿戴ければ諦めます;;)

専門家に質問してみよう