
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数ファイルにある特定のシー...
-
ローマ字→カタカナへ変換(エク...
-
マクロ 実行ボタンを押さずに...
-
Excel VBA のdebug(F8キー) が...
-
エクセル グラフの軸の最小値最...
-
エラーになってないのにVBA...
-
Wordの画面を左右にスクロール...
-
EXCELのセルへ、デジタル時計を...
-
Excel マクロの自動実行と編集作業
-
エクセルのマクロボタンがどん...
-
エクセルのマクロ機能で前のシ...
-
TeraTermのマクロについて
-
texのカウンターについて
-
Excelの改ページ 同シート内で...
-
エクセルで複数のシートをまと...
-
秀丸エディタに検索履歴を記憶...
-
エクセルのマクロショートカッ...
-
MSWord のマクロ修正のお願い
-
エクセルでマクロ実行中に任意...
-
Excelを開いた時に表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ローマ字→カタカナへ変換(エク...
-
複数ファイルにある特定のシー...
-
マクロ 実行ボタンを押さずに...
-
Excel VBA のdebug(F8キー) が...
-
EXCELのセルへ、デジタル時計を...
-
エラーになってないのにVBA...
-
Excelを開いた時に表示さ...
-
Wordの画面を左右にスクロール...
-
エクセル グラフの軸の最小値最...
-
EXCEL 複数のシートの同一の位...
-
モジュール内のマクロを全て実...
-
エクセルのマクロ機能で前のシ...
-
開いているフォルダを全て閉じ...
-
エクセルで複数のシートをまと...
-
マクロボタンをある条件の時に...
-
VBAでEXCELに埋め込んだPDFを開...
-
マクロボタンを作ってのマクロ...
-
【Excel VBA】エラー番号400
-
EXCEL2000 VBA マクロ実行中に...
-
【エクセル】 キーを押すと、...
おすすめ情報