Bunu yaptığınızda:
Set r = Range("A1")
Gerçekten ne gerçekten ilgilendirir şudur:
Dim r As Variant
Set r = Application.ActiveSheet.Range("A1")
Yani tüm değişkenleri bildirmek ve
hep her modülün üst kısmında
Option Explicit
belirtmek - VBA bildirilmemiş değişkenler (veya yazım hataları) kullanan bir kod derlemek etmeyecekmişsiniz şekilde. Ve açık bir türü ile değişkenleri bildirmek:
Dim r As Range
A Range
nesne, ait olduğu çalışma sayfası olan onun Parent
bilir; Bu nedenle, numaralı telefonun bu aralığı etkin çalışma sayfası için geçerli olduğunu unutmayın. Ve başka bir sayfayı etkinleştirseniz bile (o zamanın% 99,999'unu yapmanız gerekmeyecek) bu sayfa üzerinde kalır.
Yani bunu yapamaz nedeni şudur:
Worksheets("Sheet42").r.Value = 1
r
Çünkü Worksheet
nesnenin bir üyesi değil - çok özel çalışma sayfasında çok özel bir adrese işaret eden bir yerel nesne değişkeni var.
Dim sheet As Worksheet
Set sheet = Worksheets.Item("Sheet42")
Ve Worksheets
koleksiyonun Item
özelliği bir Object
döndürür herhangi üyesi ararım şu anlama gelir: Eğer Worksheets("Sheet42")
yaptığınızda, şimdi, gerçekten onun Item
özelliktir Worksheets
toplama sınıfının varsayılan özelliğini, erişiyorsunuz Bundan sonra eklemek sonradan bağlanan olacak/çalışma anında çözüldü:
çalışma zamanı sırasında
Dim obj As Object
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway
, VBA AnythingYouWantHereWillCompileAnyway
aramaya nesnenin arayüzü sorgular ve bu üyeyi bulamazsa - ve bu nasıl sen al Çalışma zamanı hatası 438 - "nesne bu özelliği veya yöntemi desteklemiyor".
Sen derleme zamanı için (yerine çalışma zamanı) yani erken bağlanmış aramalar yerine
Object
arasında
Worksheet
arayüzü/sınıfı ile çalışma ile çalışarak geri o tip güvenliğini taşıyabilirsiniz
:
Dim obj As Worksheet
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway 'nope. that won't compile anymore.
'u sorduğunuzda, başka bir çalışma sayfası için bir aralığı (önceden ayarlanmış olan) nasıl atayabilirim?, bir Range
nesnesinin bir adresten başka bir şey olmadığını varsayarsınız - ve bu varsayım yanlıştır. A, çok bir adresinden daha fazlasıdır. Sadece bir adres olsaydı, o zaman bir nesne değil, bir dizgi olur.
Bir adres temsil eden bir değişken istiyorsanız, yapabileceği String
değişkenle: niteliksiz `Range` örtük çağırır farkında üzerine Select` ve` Activate` `varsaymak için değil
Dim a As String
a = "A1"
Dim r1 As Range
Set r1 = Sheet1.Range(a)
Dim r2 As Range
Set r2 = Sheet2.Range(a)
şeref aktif sayfaya bakınız. –