2017-03-15 65 views
7

Ayar aralığı hakkında bir sorum var. Çalıştığım bir şey var ve çalışmıyor. en Yazdığım örneğin ben, aralık r var diyelim:Excel için VBA - Aralık ayarlama

set r = range("a1") 

Ama worksheet1 üzerinde ve ben r.value = 1 o zaman değerini değiştirecek yazarsanız bu aralık, örneğin etkin çalışma için geçerlidir Aktif hücre üzerinde bu hücrenin. Şimdi o belirli aralığın değerini başka bir çalışma sayfasında değiştirmek istiyorum. Bu yüzden, ben bunu yazdığımda, Object'in bu propertu veya yöntemi desteklemediğini yazdığını belirtmek isterim. Neden? Başka bir çalışma sayfası için (önceden ayarlanmış) bir aralığı nasıl atayabilirim? sorunumu çözecek

worksheets("specificworksheet").range("a1").value=1 

yazma Bu durumda, ancak, somethimes ben cells.find (...) kullanılan r, bir hücreyi assinged örneğin eğer daha karmaşık aralığı vardır. Herhangi bir yardım için teşekkür ederiz, teşekkürler!

+0

şeref aktif sayfaya bakınız. –

cevap

4

Şunları kullanabilirsiniz Adres:

worksheets("specificworksheet").range(r.Address).value=1 
2

kullanım With-End With sözdizimi ve nokta ile her Range() (ve Cells()) spesifikasyonlarını önce

With Worksheets("specificworksheet") 
    .Range("a1").Value = 1 
    .Range("B3:C5").Value = 2 
End With 
+0

Downvoter Bu cevabı geliştirmek isterim. Bana neyin yanlış olduğunu anlatayım mı? (umut @ Mat'sMag onun güzel ifade çalmak benim için sorun değil) – user3598756

5

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) 
+1

@Downvoter Bu cevabı geliştirmek isterim. Bana neyin yanlış olduğunu anlatayım mı? –

+1

Yine, çok daha iyi bir açıklama ve çözünürlük. Dize yaklaşımını eklemeyi düşündüm ama sonra meşgul oldum, sadece geri döndüm ama olduğu gibi bırakacağım ve OP'in sizinkilere değişeceğini umuyorum. –

+1

OP'nin çalışma zamanı hatası 438'in daha kapsamlı bir açıklamasını içerecek şekilde düzenlenmiştir. –