• ベストアンサー

Excel VBAでの 停止→手作業→再開始

ExcelのVBAを使ってピボットテーブルなどを作成しているのですが、途中でVBAを停止させ、図表の修正や、ピボットテーブルのデータを基に作業をしたいと思っています。 色々と検索したり、書物をあさったりしているのですが、MsgBoxや時間を決めてLoopさせる等は記載されているのですが、どちらも手入力等は出来ません。 ちまたでは出来ない様なコメントも目にしますが、本当にできないのでしょうか? どなたか出来るのであればご指導をお願い致します。 出来ればVBAの記述方法を教えて頂ければ幸いです。

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

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.3

こんばんは やはり処理毎にマクロを分けて実行するのがいいかと思いますが、 出来るのか出来ないのかという疑問に対しては、 ユーザーフォームを挿入して、ラベルを配置して 「作業を開始してください 終了後"OKボタンを押してください」 と表示するようにし、コマンドボタンを配置して、キャプションをOKとし、 Private Sub CommandButton1_Click()   f = True   Unload Me End Sub とクリックイベントを設定します。 標準モジュールに、 Public f As Boolean Sub test()   ActiveSheet.PivotTables("ピボットテーブル1").CompactLayoutRowHeader = "UserName"   ActiveSheet.PivotTables("ピボットテーブル1").RowAxisLayout xlTabularRow     '⇒この部分で止めたいと思っています   UserForm1.Show 0   f = False   Do    DoEvents   Loop Until f = True   ActiveWorkbook.ShowPivotTableFieldList = False   Sheets.Add After:=ActiveSheet   ActiveSheet.Name = "案件別" End Sub として実行してみて下さい。

chi_ko6262
質問者

お礼

有難うございました。思い通りの結果に大満足です。少し(だいぶ)理解するまでに時間を費やしてしまいましたが、すごく感謝しております。 ユーザーフォームとPublicには全然頭に行かず、さすがだな~!とつくづく実感じております。 本当に有難うございました。 またお手数をお掛けする時が有ると思いますが、その節には何卒、宜しくお願い致します。

その他の回答 (2)

  • 3620313
  • ベストアンサー率33% (4/12)
回答No.2

私も、上記の内容、よくやります 学習マクロをつなぎながらつくっているので、次の様にマクロのブロック単位管理でよいのでは? '表整理 sub macro1 macro2 end sub 'ピポット編集 sub macro2 macro3 end sub 'グラフ作成 sub macro3 end sub 上記の様にブロック単位にしておくと、どこまで正しい動作しているかを把握することが出来ます。 また、ファイル自体も、正しく動作したところまでを名前で管理して保存しておくと、 楽です。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは どの部分で止めるかです。 Sub test()   Dim i As Long   For i = 1 To 100000000     If (i Mod 10000) = 0 Then Stop     Cells(1, 1) = 1     DoEvents   Next End Sub ループの途中でも一定の間隔で止めたり、ループ中にCtrl+Pauseで止めたり は出来ます。 再スタートはVBE画面でF5で継続出来ます。 こんな感じで要件満たせますか?

chi_ko6262
質問者

補足

返事が遅くなり申し訳ございません。色々と試していた為に遅くなりました。ご助言頂いたループも試してみましたが、誰でも使える様汎用的にしたいと思って要る為、申し訳ございませんが要件は満たしておりません。 下記に補足を記載させて頂きますので再度ご指導頂ければ幸いです。 >どの部分で止めるかです。 上記に関しては部分的に抜き出した下記の部分で止めたいと思っています。 ActiveSheet.PivotTables("ピボットテーブル1").CompactLayoutRowHeader = "UserName" ActiveSheet.PivotTables("ピボットテーブル1").RowAxisLayout xlTabularRow '⇒この部分で止めたいと思っています。 ActiveWorkbook.ShowPivotTableFieldList = False Sheets.Add After:=ActiveSheet Sheets("Sheet3").Select Sheets("Sheet3").Name = "案件別" 説明不足が有りましたので、補足させて頂きます。 1.停止するタイミングで「作業を開始してください」などのMsgBoxで表示し、"OK"ボタンを押します。 2.手作業を開始します。このタイミングで「終了後"OKボタンを押してください"」などのMsgBoxを表示させておきます。 3.手作業終了後、MsgBoxの"OK"ボタンを押してマクロの再開始 この様な事は可能でしょうか? 甘えてばかりですみません。 何卒、宜しくお願い致します。

関連するQ&A

  • Excel VBAの自動生成VBAでエラーが発生?

    ' ↑ 'この上にピポットテーブルを作る為のデータをSheetに生成し '下記でそのSheetに名前を付けてピポットテーブルを作成するVBA Dim wk As String wk = Application.InputBox("シート名を入力ください") If wk <> "False" Then ActiveSheet.Name = wk Else MsgBox "キャンセルされました。" Exit Sub End If Sheets.Add MsgBox "選択したシート名は" & wk & "です。" '-------------------------------------------------------------------------------------------------------------------- 'この中でエラーメッセージが出てしまっています。 'どこがいけないのでしょうか? ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ wk & "!R1C1:R95C18", Version:=xlPivotTableVersion15).CreatePivotTable _ TableDestination:="Sheet1!R3C1", TableName:="ピボットテーブル1", DefaultVersion _ :=xlPivotTableVersion15 '------------------------------------------------------------------------------------------------------------------- Sheets("Sheet1").Select Cells(3, 1).Select With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("UserName") .Orientation = xlRowField .Position = 1 End With ActiveSheet.PivotTables("ピボットテーブル1").AddDataField ActiveSheet.PivotTables( _ "ピボットテーブル1").PivotFields("作業時間"), "合計 / 作業時間", xlSum ActiveSheet.PivotTables("ピボットテーブル1").CompactLayoutRowHeader = "UserName" Rows("1:2").Select Selection.Delete Shift:=xlUp Range("C16").Select Sheets("Sheet1").Select Sheets("Sheet1").Name = "名別"

  • エクセルVBAでBeep音は?

    エクセル2000、Win2000です。 VBAで音を出そうと、下記のマクロを記述しました。 ところが、「MsgBox i & "回実行しました。」の部分を、コメントブロックしたら一回しか鳴りません。ビー、ビー、ビーと三回鳴ると思ったのですが、どうしてでしょうか? Sub sound() Dim i As Integer For i = 1 To 3 Beep 'MsgBox i & "回実行しました。" Next i End Sub

  • エクセルVBAで。

    お世話になります。 VBA初心者です。 (初心者でもないのですが、しばらく遠ざかっていました。) エクセルVBAの記述内容をコピーし、 エクセルの通常のシートへ貼り付けした際、 記述上「’」で始まる文字は緑色が付いていますが、 通常のシートへ貼り付けした際、黒字になってしまいます。 そこで、下記の様なVBAを記述し、貼り付け後に、 「’」から始まる文字を緑色に着色しようと試みましたが (やはり)うまくいきませんでした。 エクセル関数なんかも織り交ぜたおかしな記述だと思いますが 何となくやりたい事が伝わって頂けるかと思うのですが、 どう修正したら出来ますでしょうか。 ご教授下さいます様、宜しくお願いいたします。   記 Sub 色() Dim y As Integer Dim x As Integer Dim a As Integer mysheet = ActiveSheet.Name For y = 1 To 10 x = Sheets(mysheet).Cells(Rows.Count, y).End(xlUp).Row a = 0 Do Until a > x a = a + 1 If Right(Cells(y, a), 1) = "'" Then Cells(y, a).Select Selection.Font.ColorIndex = 10 End If Loop Next End Sub

  • VBA 制限時間を、一時停止させたい

    Excel VBAでの質問です。Excel2007使用です。 ユーザーフォームに制限時間と、制限時間を一時停止させるコマンドボタンを作りたいです。制限時間(60分)は、下ので実行できたのですが、一時停止ができるか、わかりません。 Private Sub 制限時間_Click() Dim myTime As Date Dim myLImit As Date myLImit = Now + TimeValue("1:00:00") Do While myLImit > Now DoEvents myTime = myLImit - Now 分表示.Caption = Minute(myTime) & "分" 秒表示.Caption = Second(myTime) & "秒" Loop msgbox "終了です。" Unload Me End Sub できれば、ボタンを押すとmsgbox"一時停止"を表示させ、表示させている間は、制限時間を一時停止させたいです。制限時間、一時停止ができれば、違うコードでもかまいません。 どうぞよろしくお願いします。

  • エクセル VBAについて

    初心者ですが、指導してください。 エクセルでVBA・マクロを使用して見積書を作っています。 AファイルとBファイルを順番に開いた状態で使用します。 Bファイルは見積書のテンプレートファイルになっています。 Bファイルで担当者が新しく見積書を作った場合、 ファイル保存というボタンで、指定のホルダ内に任意のファイル名で保存する事が可能になっています。 新しく保存したファイルをCファイルとします。 Cファイルを修正等する場合は、AファイルからCファイルを読み込みます。 Aファイルは、トップページ兼価格リスト表になっています。 ここで問題というか分からなくなっている部分は、 テンプレートファイルであるBファイルの時は、VBAの記述の際に、 Windows("B.xls").Activate と記載していますが、 任意のファイルであるCファイルの時は、 担当者によって、任意のファイル名で保存されているため ファイル名の取得?が必要になると思います。 その場合、どの様な記述をすればいいのでしょうか? なかなか上手に説明できませんが、よろしくお願いします。

  • EXCELピボットのアイテムを消したい

    よろしくお願いします。 EXCELのピボットテーブルでの質問です。 ピボットを作成した後、元のデータを変更し、ピボットの「データの更新」を行います。 すると、(ページフィールドではなく)行フィールドや列フィールドでドリルダウンをすると、今は存在しないアイテムもドリルダウンの中に表示されてしまいます。 これを現在あるデータのみにするにはどうすればいいでしょうか。 「ピボットを一旦削除し再作成する」のは避けて、他の方法はないでしょうか。VBAでも構いません。 例えば、 (1)基になるデータの商品という列にはリンゴ、バナナ、という行があった。 (2)ピボットを作成 (3)基のデータのリンゴを、レモンに変更 (4)ピボットの「データの更新」 この状態で、ピボットの行または列の商品をドリルダウンすると、リンゴ、バナナ、レモン が、ドリルダウン中に表示されてしまいます。 これを、バナナとレモンのみのドリルダウンにしたい、ということです。 よろしくお願いします。

  • VBAで指定時刻まで一時停止するコード

    VBA初心者です。 業務で使用するため、VBAで指定時刻まで一時停止するコードを作りたいのですが、うまくいきません。 設定したい条件は (1)当日の午前9時から実行 (2)記述しているコードの実行が終了したら、当日の午後6時まで一時停止 (このとき他の業務でExcelを使用するので、Excelの動作を止めないためにDoEventsと記述してOSに制御を移しています) (3)当日午後6時になったら、コードの実行を再開する 以上です。 今のところ、午後6時まで動作が停止せず、すぐに午後6時以降に実行したいコードが実行されてしまいます。 どういうコードを記述すればいいでしょうか?教えてください。 ------------------------------------------------------------------------------------------------------------------ ~(中略)~ Dim PauseTime As Single Dim Start As Variant Dim Finish As Date Dim TotalTime As Variant Start = Now() Do PauseTime = Start + TimeValue("08:59:20") DoEvents Loop While Now() < Finish Finish = TimeValue("18:00:03") ~(中略)~ ------------------------------------------------------------------------------------------------------------------

  • EXCEL VBAの OLEObjectについて

    EXCELでVBAを組んである処理をしているのですが、 EXCELのワークシート上にコントロールツールの OptionButtonをいくつか配置してあり、チェックのあるものを VBAのテーブルに入れて処理しようとしていますが、 ”実行時エラー1004 WorkSheetクラスのOLEObjectプロパティを取得できません。” というエラーが出てしまいます。 OLEObjectを使うのが初めてなので、初歩的なミスじゃないかと思います VBAの記述は以下のとおりです Sheets(ReferSheet).Select For i = 1 To 12 If Sheets(ReferSheet).OLEObjects("OptionButton" & i).Object.Value = True Then OpBt(i) = 1 End If Next どうかご指導お願いいたします。

  • Access2000VBAで前に記述したコードが終わる前に次に進みます・・・

    フォームを開いた後、Msgboxを表示させたくて、Access2000VBAのOpenイベント又はLoadイベントに、Msgboxを記述しました。 ところが、フォームが開く前にMsgboxが表示されてしまします。フォームが開いた後Msgboxを表示させるためにはどうしたらよいのですか? また、ADOで接続したテーブルの数値型フィールドの合計値を計算して、計算結果をテキストボックスに代入するコードを記述した後、このテキストボックスの値をMsgboxに表示させるコードを記述たところ、計算を終える前にMsgboxが表示されてしまいます。 前のコードが確実に実行された後、次のコードの処理に進む様にするにはどうすればよいのですか?

  • VBAによるレコードの追加について。

    同じテーブル構造をもつ2つのテーブルあり、Aという名前のテーブルにBという名前のテーブルの1レコードを1度に追加するには、ACCESS2003のVBAでは、どのように記述すればよいのでしょうか?イメージは、下記のとおりです。 Set TBL = DB.OpenRecordset("A", DB_OPEN_TABLE) Set TBL2 = DB.OpenRecordset("B", DB_OPEN_TABLE) Do Until TBL2.EOF TBL.AddNew TBL = TBL2 ‘← ココの記述が分かりません。 TBL2.MoveNext TBL.Update Loop

専門家に質問してみよう