- ベストアンサー
プログラスバー表示の更新について
office365 ,office2016でも同じ serial1のシートが50件,serial2のシートが10件の状態で macro1,macro2を連続して実行すると macro1の内容のプログレスバーは正しく表示するが、 macro2のプログレスバーは100%の時点で最大までいかない。 excelファイルを閉じて、 macro2,macro1の順に連続して実行すると macro2の内容のプログレスバーは正しく表示するが、 macro1のプログレスバーは20%の時点で実行時エラー'380' Invalid property value のエラー表示が出る。 excelファイルを開いて macro1実行し excelファイルを閉じて macro2実行すると 両方のプログレスバー共、正しく表示される また macro1実行しユーザフォームのinfo2をダブルクリックして macro2実行すると 両方のプログレスバー共、正しく表示される という状況です。 serialの値が更新されていないのが原因みたいです。 いろいろやってみたのですが、対処内容が分かりません。 どうやったらmacro1,macro2連続実行してプログラスバーの表示が正しく表示されるか教えていただきたく。 ユーザフォームinfo2のマクロ Private Sub UserForm_Initialize() Dim serial As Long serial = Worksheets("MENU").Cells(1, 8).Value With ProgressBar2 .Min = 0 .Max = serial .Value = 0 End With パーセント.Caption = "" End Sub マクロ1 sub macro1() serial = Worksheets("serial1").Cells(Rows.Count, 1).End(xlUp).row Worksheets("MENU").Cells(1, 8).Value = serial 'いろんな処理 info2.Show vbModeless info2.StartUpPosition = 0 info2.Top = 0 info2.Left = 465 ' With info2 .ProgressBar2.Value = I .パーセント.Caption = Int(I / serial * 100) & "%" .kisyu.Caption = Worksheets("serial1").Cells(I, 1).Value .Repaint End With マクロ2 sub macro2() serial = Worksheets("serial2").Cells(Rows.Count, 1).End(xlUp).row Worksheets("MENU").Cells(1, 8).Value = serial 'いろんな処理 info2.Show vbModeless info2.StartUpPosition = 0 info2.Top = 0 info2.Left = 465 ' With info2 .ProgressBar2.Value = I .パーセント.Caption = Int(I / serial * 100) & "%" .kisyu.Caption = Worksheets("serial2").Cells(I, 1).Value .Repaint End With
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こうゆうことではないでしょうか。 Sub macro1() '途中略 Dim serial As Long serial = Worksheets("serial1").Cells(Rows.Count, 1).End(xlUp).Row info2.ProgressBar2.Max = serial '途中略 End Sub Sub macro2() '途中略 Dim serial As Long serial = Worksheets("serial2").Cells(Rows.Count, 1).End(xlUp).Row info2.ProgressBar2.Max = serial '途中略 End Sub
その他の回答 (1)
- HohoPapa
- ベストアンサー率65% (455/693)
再現テストは行っていません。 (事実上再現テストができません) 一方、以下が気になります。 再現するコードを提示するとともに I info2 パーセント kisyu それぞれが何者なのかを明示してもらわないと評価ができません。 I これは整数型の変数ですか? info2 これはフォームのオブジェクト名ですね? パーセント kisyu これらは、 info2 に配置したLabelですか? 提示されたコードを見る限り、 Private Sub UserForm_Initialize() Dim serial As Long serial = Worksheets("MENU").Cells(1, 8).Value この serial と sub macro1() serial = Worksheets("serial1").Cells(Rows.Count, 1).End(xlUp).row この serial と sub macro2() serial = Worksheets("serial2").Cells(Rows.Count, 1).End(xlUp).row この serial は 別物として扱われますが、それで正しいですか? 更に、 macro1のプログレスバーは20%の時点で実行時エラー'380' Invalid property value このエラーは、 With info2 .ProgressBar2.Value = I このコードで起きているものと思います。 まずは、 Option Explicit をコード先頭に書き加え https://tonari-it.com/excel-vba-debug-print/ を参考に With info2 .ProgressBar2.Value = I を With info2 Debug.print I .ProgressBar2.Value = I とすることで Iに埋まっている値を確認してみてください。
補足
回答ありがとうございます。 下記に回答します。 再現するコード Option Explicit Sub macro1() Application.ScreenUpdating = False Dim serial As Long serial = Worksheets("serial1").Cells(Rows.Count, 1).End(xlUp).row Worksheets("MENU").Cells(1, 8).Value = serial Dim I As Long I = 1 Do Until Worksheets("serial1").Cells(I, 1) = "" Worksheets("serial1").Cells(I, 7).copy _ Destination:=Worksheets("MENU").Cells(5, 3) info2.Show vbModeless info2.StartUpPosition = 0 info2.Top = 0 info2.Left = 465 With info2 Debug.Print I .ProgressBar2.Value = I .パーセント.Caption = Int(I / serial * 100) & "%" .kisyu.Caption = Worksheets("serial1").Cells(I, 1).Value .Repaint End With I = I + 1 Loop Application.ScreenUpdating = True End Sub Sub macro2() Application.ScreenUpdating = False Dim serial As Long serial = Worksheets("serial2").Cells(Rows.Count, 1).End(xlUp).row Worksheets("MENU").Cells(1, 8).Value = serial Dim I As Long I = 1 Do Until Worksheets("serial2").Cells(I, 1) = "" Worksheets("serial2").Cells(I, 7).copy _ Destination:=Worksheets("MENU").Cells(5, 3) info2.Show vbModeless info2.StartUpPosition = 0 info2.Top = 0 info2.Left = 465 With info2 Debug.Print I .ProgressBar2.Value = I .パーセント.Caption = Int(I / serial * 100) & "%" .kisyu.Caption = Worksheets("serial2").Cells(I, 1).Value .Repaint End With I = I + 1 Loop Application.ScreenUpdating = True End Sub serial1シート A列 G列 A001 ABC A002 ABC A003 ABC … A049 ABC A050 ABC serial2シート A列 G列 B001 XYZ B002 XYZ B003 XYZ … B009 XYZ B010 XYZ の様な構成です。 なお、だいぶ省略しています。 ホントは2000行くらいでもっといろいろな処理があるのですが、上記内容は再現する最低限の内容になってます。 I info2 パーセント kisyu それぞれが何者なのかを明示してもらわないと評価ができません。 I これは整数型の変数ですか? → そうです。何行目の物件を処理してるという意味です。 info2 これはフォームのオブジェクト名ですね? → そうです。ユーザフォームです。 パーセント kisyu これらは、 info2 に配置したLabelですか? → そうです パーセント:全体の何%目くらいを実行中の表示用です。 kisyu:A列のデータを表示させます。 提示されたコードを見る限り、 Private Sub UserForm_Initialize() Dim serial As Long serial = Worksheets("MENU").Cells(1, 8).Value この serial と sub macro1() serial = Worksheets("serial1").Cells(Rows.Count, 1).End(xlUp).row この serial と sub macro2() serial = Worksheets("serial2").Cells(Rows.Count, 1).End(xlUp).row この serial は 別物として扱われますが、それで正しいですか? → 違います。 UserFormのserialとmacro1のserialは同じものとして扱いたい UserFormのserialとmacro2のserialは同じものとして扱いたい macro1のserialとmacro2のserialは別物として扱いたい です。 Worksheets("MENU").Cells(1, 8).Valueの部分でserialを共用にし、上記構成を実現しているつもりです。 更に、 macro1のプログレスバーは20%の時点で実行時エラー'380' Invalid property value このエラーは、 With info2 .ProgressBar2.Value = I このコードで起きているものと思います。 → その通りです まずは、 Option Explicit をコード先頭に書き加え https://tonari-it.com/excel-vba-debug-print/ を参考に With info2 .ProgressBar2.Value = I を With info2 Debug.print I .ProgressBar2.Value = I とすることで Iに埋まっている値を確認してみてください。 → macro2を実行後にmacro1を実行すると Iが11と表示されてエラーになります。 プログレスバー表示はFULL表示となってます。 macro2実行後、userformの .Max = serialの値が50になってくれたらよいのですが、このMAX値の更新ができていないのがエラーの原因だと思っていますが、対処内容が分からない次第です。
お礼
回答ありがとうございます。 無事動作しました。 助かりました。