Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


328 / 13645 ツリー ←次へ | 前へ→

【80933】2回に1回エラーが出る さと 19/6/23(日) 19:23 質問[未読]
【80934】Re:2回に1回エラーが出る マナ 19/6/23(日) 20:04 発言[未読]
【80935】Re:2回に1回エラーが出る さと 19/6/23(日) 20:30 発言[未読]
【80936】Re:2回に1回エラーが出る マナ 19/6/23(日) 20:43 発言[未読]
【80937】Re:2回に1回エラーが出る さと 19/6/23(日) 21:01 発言[未読]
【80938】Re:2回に1回エラーが出る マナ 19/6/23(日) 21:31 発言[未読]
【80939】Re:2回に1回エラーが出る さと 19/6/23(日) 21:57 発言[未読]
【80940】Re:2回に1回エラーが出る マナ 19/6/23(日) 22:12 発言[未読]
【80941】Re:2回に1回エラーが出る さと 19/6/23(日) 22:29 発言[未読]
【80942】Re:2回に1回エラーが出る γ 19/6/24(月) 7:23 発言[未読]
【80948】Re:2回に1回エラーが出る さと 19/6/24(月) 22:13 お礼[未読]
【80949】Re:2回に1回エラーが出る γ 19/6/24(月) 22:19 発言[未読]
【80963】Re:2回に1回エラーが出る さと 19/6/26(水) 12:32 発言[未読]
【80971】Re:2回に1回エラーが出る よろずや 19/6/27(木) 14:22 発言[未読]
【80972】Re:2回に1回エラーが出る よろずや 19/6/27(木) 16:54 発言[未読]
【80977】Re:2回に1回エラーが出る γ 19/6/27(木) 22:10 回答[未読]
【80985】Re:2回に1回エラーが出る さと 19/7/1(月) 12:36 お礼[未読]

【80933】2回に1回エラーが出る
質問  さと  - 19/6/23(日) 19:23 -

引用なし
パスワード
   マクロ初心者です。
調べても原因が分かりませんでした。
原因が分かる方がいましたら、教えていただきたいです。

1回目にマクロを実行すると「エラー1004」が出ます。
エラー画面で終了を押して、もう一度実行するとエラーが出ず、処理が完了します。
3回目もエラーが出て、4回目はうまくいきます。
このように2回に1回エラーが出ます。

エラーが出るのは、以下のコードです。

Option Explicit

Sub 当月入力準備()
  Application.ScreenUpdating = False
  Dim a As Long, b As Long
  a = Selection.Rows.Count
  b = Selection.Columns.Count
  With Sheets("7月")
    .Range("B2").CurrentRegion.Offset(2, 1).Select
    Selection.Resize(a - 3, b - 1).Select
    Selection.Copy
    .Range("B2").CurrentRegion.Offset(3, 1).Select
    Selection.Resize(a - 3, b - 1).Select
    Selection.PasteSpecial xlPasteValues
    .Range("B2").CurrentRegion.Offset(2, 1).Select
    Selection.Resize(a - 6, b - 1).Select
    Selection.ClearContents
  End With
End Sub

【80934】Re:2回に1回エラーが出る
発言  マナ  - 19/6/23(日) 20:04 -

引用なし
パスワード
   ▼さと さん:

>このように2回に1回エラーが出ます。

この原因はわかりませんが

a-6が、1以上でないとエラー
b-1も、1以上でないとエラー

です。Resizeできないので。

あと、7月シートがactiveでないとエラーになります。

【80935】Re:2回に1回エラーが出る
発言  さと  - 19/6/23(日) 20:30 -

引用なし
パスワード
   返信ありがとうございます。

指摘内容を確認してみたのですが改善されませんでした。
まだ私が内容ををしっかり理解できていないせいかもしれないですが…

以下のように変数の宣言を使用しないように試してみったら、全くエラーが出ません。
変数の宣言の仕方がおかしいのでしょうか?
何か分かることありましたらご教授願います。


Sub 当月入力準備()
  Application.ScreenUpdating = False
  With Sheets("7月")
    .Range("B2").CurrentRegion.Offset(2, 1).Select
    Selection.Resize(Selection.Rows.Count - 3, Selection.Columns.Count - 1).Select
    Selection.Copy
    .Range("B2").CurrentRegion.Offset(3, 1).Select
    Selection.Resize(Selection.Rows.Count - 3, Selection.Columns.Count - 1).Select
    Selection.PasteSpecial xlPasteValues
    .Range("B2").CurrentRegion.Offset(2, 1).Select
    Selection.Resize(Selection.Rows.Count - 6, Selection.Columns.Count - 1).Select
    Selection.ClearContents
  End With
               
End Sub

【80936】Re:2回に1回エラーが出る
発言  マナ  - 19/6/23(日) 20:43 -

引用なし
パスワード
   ▼さと さん:

以下のマクロの実行結果が理解できますか。

Sub test()
  Dim a As Long
  
  Sheets("7月").Activate
  Range("B2").Select
  
  a = Selection.Rows.Count
  
  MsgBox Selection.Rows.Count
  MsgBox a

  Range("B2").CurrentRegion.Offset(2, 1).Select
 
  MsgBox Selection.Rows.Count
  MsgBox a
 
End Sub

【80937】Re:2回に1回エラーが出る
発言  さと  - 19/6/23(日) 21:01 -

引用なし
パスワード
   ▼マナ さん:

前半部分は、
B2が選択されてaがその行数となるので
メッセージボックスに1が表示される。

後半部分は、
B2を含む範囲が選択されて、その選択範囲がoffsetで
行と列が移動して、その状態の選択範囲の行数が
メッセージボックスに表示される。

このように理解しています。

【80938】Re:2回に1回エラーが出る
発言  マナ  - 19/6/23(日) 21:31 -

引用なし
パスワード
   ▼さと さん:

では、以下は a で問題ないですか。

>    .Range("B2").CurrentRegion.Offset(2, 1).Select
>    Selection.Resize(a - 3, b - 1).Select

 

【80939】Re:2回に1回エラーが出る
発言  さと  - 19/6/23(日) 21:57 -

引用なし
パスワード
   ▼マナ さん:

.Range("B2").CurrentRegion で選択された範囲が
4以上なら問題ないということで良いでしょうか?

【80940】Re:2回に1回エラーが出る
発言  マナ  - 19/6/23(日) 22:12 -

引用なし
パスワード
   ▼さと さん:

>.Range("B2").CurrentRegion で選択された範囲が
>4以上なら問題ないということで良いでしょうか?

エラーがでないということと
期待通りの動作をするということは別です。

で、わたしには、何をしようとしているか理解できていません。

そのマクロで、どういう結果になることを期待していますか。

【80941】Re:2回に1回エラーが出る
発言  さと  - 19/6/23(日) 22:29 -

引用なし
パスワード
   ▼マナ さん:

期待通りの動作はしています。
動作はしていますが、エラーで出るので
何か問題があるのではと気になり、質問しました。
何かコードに問題があるのかと…

エラーが出ることは別の話という考えがありませんでした。
動作はしているので、そういうものだと理解します。

色々と、ご指摘ありがとうございました。

【80942】Re:2回に1回エラーが出る
発言  γ  - 19/6/24(月) 7:23 -

引用なし
パスワード
   横から失礼する。
■19/6/23(日) 19:23のコードでは、
無造作に
 a = Selection.Rows.Count
 b = Selection.Columns.Count
で始まっている。
そのとき何が選択されているから分かったものじゃない。
前の処理で、最終的にSelectされるものが前提になっているとすると、
Selection.Resize(Selection.Rows.Count - 6, Selection.Columns.Count - 1).Select
で大きさが縮んだものになっているのではないか。

■一方で、19/6/23(日) 20:30のコードでは、
Selectionの大きさは、Range("B2").CurrentRegionに由来しているものになっている。
だから上記のようなことは起きない。

両者は明確に違うと思う。どうすればよいかは自ずと明らかでしょう。

【80948】Re:2回に1回エラーが出る
お礼  さと  - 19/6/24(月) 22:13 -

引用なし
パスワード
   ▼γ さん:

Range("B2").CurrentRegionの次の行に
変数の宣言を入れ込んだら、エラーが出なくなりました。
連続して行う場合、前の処理のセレクト部分が
変数に反映されていると考えたら分かりやすかったです。

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

【80949】Re:2回に1回エラーが出る
発言  γ  - 19/6/24(月) 22:19 -

引用なし
パスワード
   >Range("B2").CurrentRegionの次の行に
>変数の宣言を入れ込んだら、エラーが出なくなりました。
変数の宣言位置は余り関係ないと思います。
現在のコードを提示してみてはいかがですか?

【80963】Re:2回に1回エラーが出る
発言  さと  - 19/6/26(水) 12:32 -

引用なし
パスワード
   ▼γ さん:
これが現在のコードで、このように変数の宣言の位置を変えたら、何回も連続で処理を行ってもエラーが全く出なくなりました。

Option Explicit

Sub 当月入力準備()
  Application.ScreenUpdating = False
  With Sheets("7月")
   
   .Range("B2").CurrentRegion.Offset(2, 1).Select

  Dim a As Long, b As Long
  a = Selection.Rows.Count
  b = Selection.Columns.Count

    Selection.Resize(a - 3, b - 1).Select
    Selection.Copy
    .Range("B2").CurrentRegion.Offset(3, 1).Select
    Selection.Resize(a - 3, b - 1).Select
    Selection.PasteSpecial xlPasteValues
    .Range("B2").CurrentRegion.Offset(2, 1).Select
    Selection.Resize(a - 6, b - 1).Select
    Selection.ClearContents
  End With
End Sub

【80971】Re:2回に1回エラーが出る
発言  よろずや  - 19/6/27(木) 14:22 -

引用なし
パスワード
   提示されたものの無駄を省くと、以下の様になります。

Option Explicit
Sub 当月入力準備()
  Dim a As Long, b As Long
  Application.ScreenUpdating = False
  With Sheets("7月").Range("B2")   
    With .CurrentRegion
      a = .Rows.Count
      b = .Columns.Count
    End With
    .Offset(2, 1).Resize(a - 3, b - 1).Copy
    .Offset(3, 1).Resize(a - 3, b - 1).PasteSpecial xlPasteValues
    .Offset(2, 1).Resize(a - 6, b - 1).ClearContents
  End With
End Sub

マクロの記録では、Select Selection がやたら出てきますが、
これらは、基本的には不要です。

処理としてこれで正しいのかどうかは、シートの構成が判りませんので、不明です。

【80972】Re:2回に1回エラーが出る
発言  よろずや  - 19/6/27(木) 16:54 -

引用なし
パスワード
   ▼さと さん:

>  a = Selection.Rows.Count

この文の意味を誤解してるのではないでしょうか?

誤:a と Selection.Rows.Count は同じと定義する。

正:この時点の Selection.Rows.Count の値を a に代入する。

【80977】Re:2回に1回エラーが出る
回答  γ  - 19/6/27(木) 22:10 -

引用なし
パスワード
   既にコメントをいただいていて、重複になって恐縮です。

質問者さん、コードの提示ご苦労さまでした。

変数宣言の位置というよりも
> a = Selection.Rows.Count
> b = Selection.Columns.Count
という命令よりも前に、
.Range("B2").CurrentRegion.Offset(2, 1).Select
を実行していることが重要です。
「コードのなかで選択(Selectionを限定)」していることがポイントです。

つまり、
> ■19/6/23(日) 19:23のコードでは、
> 無造作に
>  a = Selection.Rows.Count
>  b = Selection.Columns.Count
> で始まっている。
> そのとき何が選択されているか分かったものじゃない。
という状態から脱したことが大きいのです。
プロシージャの開始時点における冗長性(可能性が多いこと)がなくなったことが大きいのです。

----------
なお、変数宣言の位置について補足すれば、
実行前であれば、
・使用の直前であっても
・プロシージャーの先頭に纏めても
動作に影響はありません。誤解無きよう。

【80985】Re:2回に1回エラーが出る
お礼  さと  - 19/7/1(月) 12:36 -

引用なし
パスワード
   よろずやさん、γさん

ありがとうございました。
原因が分かってすっきりしました。

328 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free