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
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
ありがとうございました。
コピペして思ったように処理できました。
これと似たケースで途中でexcel作業を入れたいものが幾つかありましたので、それにも応用できるので大変助かりました。
No.2
- 回答日時:
一定時間経過後に続行でよければOnTimeメソッドなどでも可能ですが、作業の性格からそのような設定ではうまくいかないと推測されます。
現状で、マクロの実行のきっかけをどのようにしているのか不明ですが(ボタン登録やコマンド登録かな?)、続行する際に、多分、続行の指示をしていますよね?
ということはマクロの実行を指示するのと同じなので、一番簡単なのは前半と後半のルーチンを分割しておいて、マクロを呼び出せば良いのでは?(無理に一つのサブルーチンにする必要がないと思われます)
例えばボタン登録を利用する場合を例にすれば、前半の実行ボタンと後半の実行ボタンを用意しておいて、それぞれのマクロを登録しておく。
どうしても一つのマクロにしたければ(その理由は不明ですが)、マクロを呼び出すごとに前半と後半を交互に実行するようなサブルーチンにしておくことでしょうか。(実際にはこちらの方が使いにくいと思います。誤操作も起き易いでしょうし。)
<交互に実行する構造のサンプル>
Sub test()
Static flag As Boolean
flag = Not flag
If flag Then
'First --前半の処理を記載(又はSub呼び出し)
Else
'Second --後半の処理を記載(又はSub呼び出し)
End If
End Sub
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
ありがとうございました。
Userformはこれまで使った事が無いので勉強になりました。今後userformも使ってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ローマ字→カタカナへ変換(エク...
-
マクロ 実行ボタンを押さずに...
-
複数ファイルにある特定のシー...
-
エラーになってないのにVBA...
-
《エクセル2000》非表示になっ...
-
Excel VBA のdebug(F8キー) が...
-
EXCELのセルへ、デジタル時計を...
-
【Excel VBA】エラー番号400
-
エクセル グラフの軸の最小値最...
-
Accessのクエリを実行するショ...
-
Excelを開いた時に表示さ...
-
ワードからエクセルへ貼り付け...
-
ExcelVBAで、タイマー割り込み...
-
エクセルに画像を貼付け縮小す...
-
エクセルVBA:エラー時にはマク...
-
ワードで画像を自動で挿入する方法
-
モジュール内のマクロを全て実...
-
AccessのテーブルデータをExcel...
-
エクセルで複数のシートをまと...
-
Excel文字列中の太字(Bold)部分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ローマ字→カタカナへ変換(エク...
-
マクロ 実行ボタンを押さずに...
-
複数ファイルにある特定のシー...
-
EXCELのセルへ、デジタル時計を...
-
Excel VBA のdebug(F8キー) が...
-
エラーになってないのにVBA...
-
Excelを開いた時に表示さ...
-
Wordで「原稿用紙○枚」を換算す...
-
ワードからエクセルへ貼り付け...
-
エクセルで複数のシートをまと...
-
エクセルのマクロ機能で前のシ...
-
エクセル グラフの軸の最小値最...
-
TeraTermのマクロについて
-
Excelの改ページ 同シート内で...
-
EXCEL 複数のシートの同一の位...
-
ワードで画像を自動で挿入する方法
-
Excelのワークシート上に検索窓...
-
モジュール内のマクロを全て実...
-
Excel2000 データの並べ替えで...
-
Excelマクロでオプションボタン...
おすすめ情報