プロが教える店舗&オフィスのセキュリティ対策術

今、withを勉強しています。
つい最近も教えて頂きました。

with xxx の xxxだけしか無いような極端な例を考えてみました。
こんなことは出来ないのでしょうか。

以下にコードを載せます。
test8が原型で、test9がwithを使ってみたものです。
質問は、この「obj8」をどう表現するかです。

宜しくお願いします。

Sub test8()
Dim n As Long
Dim obj8 As Variant
For n = 1 To 5
obj8 = Range("B" & n).Value
Range("C" & n).Value = obj8
Next
End Sub

Sub test9()
Dim n As Long
Dim obj8 As Variant
For n = 1 To 5
With obj8
[.] = Range("B" & n).Value
Range("C" & n).Value = [.]
End With
Next
End Sub

A 回答 (4件)

こんばんは


https://learn.microsoft.com/ja-jp/office/vba/lan …

With With object [ statements ] End With [ statements ] End With

つまりは Object である事が条件となります

Sub test8()
Dim n As Long
Dim obj8 As Variant
For n = 1 To 5
obj8 = Range("B" & n).Value
Range("C" & n).Value = obj8
Next
End Sub

obj8 は As String (Variant/String)  文字列です

Sub test9()
Dim n As Long
Dim obj8 As Variant
For n = 1 To 5
With obj8 '未設定Variant型変数
[.] = Range("B" & n).Value
Range("C" & n).Value = [.]
End With
Next
End Sub

obj8 は Variant
代入されていないVariant型変数は Empty です
変数obj8を Object型にする場合には 
使用前に Set obj8=Object とする必要があります

例 A1セルをセット

Sub test9()
Dim n As Long
Dim obj8 As Variant '(Range)
Set obj8 = Range("A1") 'RangeObjectを代入(セット)

For n = 1 To 5
With obj8
.Value = Range("B" & n).Value
Range("C" & n).Value = .Value
End With
Next
End Sub

Range("B" & n)の値をA1に書き出し 
セルA1の値をRange("C" & n)セルに書き出す
結果として

Range("B" & n).Value=Range("C" & n).Value
Next
Range("A1").Value= Range("B" & 5).Value
End Sub
と同じ結果で この例の場合 With obj8 のメリット(合理性)はありません
    • good
    • 0
この回答へのお礼

今回もありがとうございました。
良く分かりました。
説明を読んだところ、『variant』と在りましたので、
そう書いてみましたが、『object』ということなのですね、
本質が分かっていないからの質問でした。

>メリット(合理性)はありません
これは勿論承知しております。
あくまで勉強の過程として作ったモノです。

Sub test7()
Dim n As Long
Dim obj8 As Range
Set obj8 = Range("A1")
For n = 1 To 5
With obj8
.Value = Range("B" & n).Value
Range("C" & n).Value = .Value
End With
Next
End Sub

お世話になりました。

お礼日時:2022/12/19 18:06

こんにちは



with構文はオブジェクト等に対して用いるものです。
https://learn.microsoft.com/ja-jp/office/vba/lan …
一方で、ご提示の obj8 は単純変数で、その内容は値です。
「値」に対してwithを用いること自体に意味がありませんので、通常はご提示のtest8のような記述がとられます。


どうしても
>with obj8
のような形式にしたいのなら、

With obj8
obj8 = Range("B" & n).Value
Range("C" & n).Value = obj8
End With
としておけば実行できますが、Withに意味がないことがわかるでしょう。


意味のあるコードしたければ、ユーザ定義型やクラスを用いれば可能です。
例えば、

Type hoge
v As Variant
End Type

Sub test9()
Dim n As Long
Dim obj8 As hoge
For n = 1 To 5
With obj8
.v = Range("B" & n).Value
Range("C" & n).Value = .v
End With
Next
End Sub

みたいに。
(ご提示の内容で、このような回りくどいことをする意味はありませんけれど)
    • good
    • 0
この回答へのお礼

お教え有難うございました。
たった今、クローズしてしまったところで、
前後してしまいました。
申し訳ありません。

objectであること、
少し前に分かりました。
全く了解です。

お世話になりました。

お礼日時:2022/12/19 18:12

With With object [ statements ] End With [ statements ] End With


コピペミス
With With object [ statements ] End With です
参考リファレンスサイト 抜粋
すみません
    • good
    • 0

with って『頭を纏める』ですからねぇ。



with range("A1")
.value=123
end with

であって

with value
range("A1"). = 123
end with

ではないと思いますよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!