教えてください。
以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。
単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか?
Sub test01()
ActiveSheet.Cells(1, 1).Activate
Do While ActiveCell.Value <> ""
If Not IsNumeric(ActiveCell.Value) Then
ActiveCell.Offset(0, 1).Value = "文字"
ElseIf ActiveCell.Value > 0 Then
ActiveCell.Offset(0, 1).Value = "正数"
ElseIf ActiveCell.Value < 0 Then
ActiveCell.Offset(0, 1).Value = "負数"
Else
ActiveCell.Offset(0, 1).Value = "その他"
End If
ActiveCell.Offset(1).Activate
i = i + 1
Application.StatusBar = i
Loop
End Sub
Sub test02()
ActiveSheet.Cells(1, 1).Activate
With ActiveCell
Do While .Value <> ""
If Not IsNumeric(.Value) Then
.Offset(0, 1).Value = "文字"
ElseIf .Value > 0 Then
.Offset(0, 1).Value = "正数"
ElseIf ActiveCell.Value < 0 Then
.Offset(0, 1).Value = "負数"
Else
.Offset(0, 1).Value = "その他"
End If
.Offset(1).Activate
i = i + 1
Application.StatusBar = i
Loop
End With
End Sub
No.2
- 回答日時:
これは初めて知った。
Option Explicit
'==========クラスモジュールClass1=============
'Option Explicit
'Public a As Integer
'============================================
'Once you have entered a With...End With,
'you cannot reassign object until you have passed the End With.
'ってそういう意味なんだ…
Sub fuga()
Dim x As Class1
Dim y As Class1
Set x = New Class1
Set y = New Class1
x.a = 5
y.a = 4
With x
MsgBox (.a) '5
Set x = y
MsgBox (.a) '5
MsgBox (x.a) '4
End With
End Sub
ありがとうございます。
クラスモジュールってまったくわからないのでご教示のコードをはしらせることはできませんでしたが、
'Once you have entered a With...End With,
'you cannot reassign object until you have passed the End With.
って、要はWith...End With間でオブジェクトを再定義できないってことなんでしょうね。
勉強になりました。
No.3ベストアンサー
- 回答日時:
With ActiveCellの判断が、システムが行っていることと、質問者様が思っていることとで違いがあることが原因かと思われます。
(多分、With分実行時に決めている。)
以下の2例を実行してみると、ActiveCellがどのように判断されているかわかるのでは?
Sub test2()
For i = 1 To 5
MsgBox (ActiveCell.Address)
With ActiveCell
.Offset(1).Activate
End With
Next i
End Sub
Sub test1()
With ActiveCell
For i = 1 To 5
MsgBox (ActiveCell.Address)
.Offset(1).Activate
Next i
End With
End Sub
ありがとうございました。
こうやってみるとよくわかりました。
本当のActiveCellは変わっていくのにWith ActiveCellの対象は変わりませんでした。
Sub test3()
With ActiveCell
For i = 1 To 5
MsgBox (ActiveCell.Address & "/" & .Address)
ActiveCell.Offset(1).Activate
Next i
End With
End Sub
No.4
- 回答日時:
「Sub test02()」 の場合、「With ActiveCell」 の後に、 Do ループを入れていて、そのループの中で 「Offset(1)」 を使って、 次の行を Active にしようとしていますが、頭の 「With ActiveCell」 は最初の 「Cells(1, 1).Activate」 を受けていますので、ループ内で何度 「.Offset(1).Activate」 を実施しても、Cells(1, 1) にたいして Offset(1) を行いますので、結局は、Cells(2, 1) を Active にするだけでそれ以下の行を Active にすることはできません。
それゆえに Cells(2, 1) が空セルでない限りループから脱出できません。 これが無限ループの原因です。Sub test02() を F8 を使ってステップインしながら、セルの Active 状態を見てください。 Cells(2, 1) が Active になったままになっているのが分かります。
どうしても、With を使うのであれば、With と Do の行を入れ替えれば、正常に動きます。
Sub test02()
Dim i As Integer
ActiveSheet.Cells(1, 1).Activate
Do While ActiveCell.Value <> ""
With ActiveCell
If Not IsNumeric(.Value) Then
.Offset(0, 1).Value = "文字"
ElseIf .Value > 0 Then
.Offset(0, 1).Value = "正数"
ElseIf ActiveCell.Value < 0 Then
.Offset(0, 1).Value = "負数"
Else
.Offset(0, 1).Value = "その他"
End If
.Offset(1).Activate
i = i + 1
Application.StatusBar = i
End With
Loop
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでの左のセルのコピー 3 2022/07/25 12:31
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
エクセルの当番表を作っていま...
-
ネットワークループとルーティ...
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
【VBA】指定の範囲から特定の文...
-
while(*s++=*t++)の判定は?
-
イベントの発生を待つ
-
Escキーを押すと、中断する時と...
-
GIFアニメをループさせたくない
-
UWSCの終了の仕方
-
「VC++6」ウィンドウの再描画
-
Java 南京錠
-
EXCEL VBA(初心者)印刷ルー...
-
磁気ループ装置の仕組みと作り方
-
VBA Dir関数でファイルをループ...
-
重複データをテーブルに表示し...
-
一巡伝達関数と開ループ伝達関数
-
CreateJS(TweenJS)での連続した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報