Excel uchun VBA - Bir qatorni o'rnatish

Belgilangan diapazonga oid bir savol bor. Men harakat qilaman va u ishlamayapti. Masalan, men r gurumiga ega deb aytaylik, men yozganman:

set r = range("a1")

Lekin, bu qator faol ish varag'i uchun amal qiladi, masalan, agar men ish varag'i1da bo'lsam va r.value = 1 yozsam, u faol ish varag'idagi o'sha uyaning qiymatini o'zgartiradi. Keling, ushbu maxsus oraliq qiymatini boshqa bir ish sahifasida o'zgartirishni xohlayman. Men yozaman

worksheets("specificworksheet").r.value =1

Lekin, bu haqda yozganimda, ob'ekt Ob'ektni ushbu usul yoki usuli qo'llab-quvvatlamaydi, deydi. nima sababdan? Boshqa ishchi varag'i uchun (oldindan o'rnatilgan) intervalni qanday belgilash mumkin? Bunday holda yozish

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

mening muammomni hal qila oladi, biroq ba'zida yanada murakkab qatorga ega bo'laman, masalan, agar men hujayrani hujayraning oldiga qo'ysam, cells.find (...) dan foydalansam. Har qanday yordamni qadrlang, rahmat!

7
Tanlash va Activate kodini sukut qilmaganingiz uchun kodeks faol bo'lmagan sahifada noma'lum Range qo'ng'iroqlarini amalga oshirganingizdan so'ng.
qo'shib qo'ydi muallif Mathieu Guindon, manba

6 javoblar

Siz shunday qilsangiz:

Set r = Range("A1")

Siz qilayotgan haqiqatdan ham nima ishlaysiz?

Dim r As Variant
Set r = Application.ActiveSheet.Range("A1")

Shunday ekan, barcha o'zgaruvchilaringizni e'lon qiling va har bir modulning yuqori qismida har doim Option Explicit ni belgilang - VBA noma'lum parametrlarga (yoki matn terish vositalariga) ega bo'lgan kodni kompilyatsiya qilishdan voz kechadi. Argumentlaringizni ochiq turdagi deb e'lon qiling:

Dim r As Range

Range ob'ektiga tegishli bo'lgan ishchi varag'i Vali haqida biladi; shuning uchun, ta'kidlaganingizdek, ushbu intervalli faol ishchi varag'i uchun amal qiladi. . Va yana bir varaqni faollashtirsangiz ham (o'sha vaqtning 99,999% ni bajarishingizga hojat yo'q), hatto o'sha sahifada qoladi.

Shuning uchun buni qilolmaysiz:

Worksheets("Sheet42").r.Value = 1

r Worksheet ob'ektining a'zosi emasligi uchun u juda aniq ish sahifasida juda aniq manzilni ko'rsatadigan mahalliy ob'ekt o'zgaruvchisidir. Endi siz ishchi varaqlari ("Sheet42") ni amalga oshirganingizda ob'ektlar Worksheets yig'ish klassining asl xususiyatiga kirasiz > Mulk:

Dim sheet As Worksheet
Set sheet = Worksheets.Item("Sheet42")

Worksheets to'plamining ob'ekti xususiyati ob'ekt funksiyasini qaytaradi, bu siz kiritgan har qanday a'zo chaqiruvi keyinchalik kechiktirilgan/ish vaqti:

Dim obj As Object
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway

VBA, ish vaqtida ob'ektning interfeysi uchun AnythingYouWantHereWillCompileAnyway kodini qidiradi va bu a'zoni topa olmaydi - bu sizning ish vaqti xatoligini qanday qo'lga kiritadi? 438 - "ob'ekt ushbu xususiyatni qo'llab-quvvatlamaydi yoki usul ".

Ushbu turdagi xavfsizlikni qayta ishlash vaqtiga (ish vaqti) emas, balki erta-bog'langan qo'ng'iroqlar bilan ishlaydigan joyga ko'chirishingiz mumkin, ya'ni Object Object/class Worksheet kodi:

Dim obj As Worksheet
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway 'nope. that won't compile anymore.

Agar siz so'rovini boshqa bir ishchi varaqqa qanday qilib belgilash mumkin? , siz Range ob'ektini manzildan boshqa narsa emas deb hisoblaysiz va bu taxmin noto'g'ri.

Agar KOffice faqat juda dir. Agar u faqat bir manzil bo'lsa, u ob'ekt emas, balki mag'lubiyatga o'xshab ketadi.

Agar manzilni ifodalovchi o'zgaruvchini istasangiz, buni string o'zgaruvchisi bilan amalga oshiring:

Dim a As String
a = "A1"

Dim r1 As Range
Set r1 = Sheet1.Range(a)

Dim r2 As Range
Set r2 = Sheet2.Range(a)
6
qo'shib qo'ydi
@ScottCraner eh, men sizning mukammal javobingizni "hujum" qilishni xohlamadim - ba'zan ba'zi kishilar o'zlarining ovozlarini qanday sarflashlari bilan hayron qoldim. Cheers!
qo'shib qo'ydi muallif Mathieu Guindon, manba
@Downvoter tezda bu "replikatsiya" makaron javobini olishni xohladi deb o'ylayman - davom eting va barcha javoblarni pastga o'tkazing, chunki men buni qilmayman.
qo'shib qo'ydi muallif Mathieu Guindon, manba
O'Rning ish vaqti xatosi 438 ning to'liq izohini kiritish uchun tahrirlangan.
qo'shib qo'ydi muallif Mathieu Guindon, manba
@Downvoter Men ushbu javobni yaxshilashni xohlayman. Unga nima bo'lganini aytib berishga jur'at et.
qo'shib qo'ydi muallif Mathieu Guindon, manba
Shunga qaramay, juda yaxshi tushuntirish va qaror qabul qilish. Men simli yondoshuvni qo'shishni o'ylab qoldim, lekin keyin band bo'ldim, faqat qaytib keldim, lekin o'shanda men sizni tark etmoqchiman.
qo'shib qo'ydi muallif Scott Craner, manba
oooooh oooooh { havoda havodagi qo'llarni to'lqinlantiradi }, men buni qilaman. 8P Shuning uchun siz ikkitangizga uchta yuksalishingiz bor
qo'shib qo'ydi muallif Scott Craner, manba
Va nima uchun bu qabul qilingan javob bo'lishi kerak. @ mathstackuser123
qo'shib qo'ydi muallif Scott Craner, manba
Hech qanday huquqbuzarlik sodir bo'lmadi, men yuqorida aytib o'tganman, juda hayajonli. Men shuni bilamanki, men etarli darajada harakat qilaman va ba'zan mening javoblarim to'liq emas. Men kulgili bo'lishga harakat qilardim. Matn hazilni to'g'ri etkazib bermaydi.
qo'shib qo'ydi muallif Scott Craner, manba
Katta javob. Ajoyib g'alati narsa
qo'shib qo'ydi muallif brettdj, manba

Siz shunday qilsangiz:

Set r = Range("A1")

Siz qilayotgan haqiqatdan ham nima ishlaysiz?

Dim r As Variant
Set r = Application.ActiveSheet.Range("A1")

Shunday ekan, barcha o'zgaruvchilaringizni e'lon qiling va har bir modulning yuqori qismida har doim Option Explicit ni belgilang - VBA noma'lum parametrlarga (yoki matn terish vositalariga) ega bo'lgan kodni kompilyatsiya qilishdan voz kechadi. Argumentlaringizni ochiq turdagi deb e'lon qiling:

Dim r As Range

Range ob'ektiga tegishli bo'lgan ishchi varag'i Vali haqida biladi; shuning uchun, ta'kidlaganingizdek, ushbu intervalli faol ishchi varag'i uchun amal qiladi. . Va yana bir varaqni faollashtirsangiz ham (o'sha vaqtning 99,999% ni bajarishingizga hojat yo'q), hatto o'sha sahifada qoladi.

Shuning uchun buni qilolmaysiz:

Worksheets("Sheet42").r.Value = 1

r Worksheet ob'ektining a'zosi emasligi uchun u juda aniq ish sahifasida juda aniq manzilni ko'rsatadigan mahalliy ob'ekt o'zgaruvchisidir. Endi siz ishchi varaqlari ("Sheet42") ni amalga oshirganingizda ob'ektlar Worksheets yig'ish klassining asl xususiyatiga kirasiz > Mulk:

Dim sheet As Worksheet
Set sheet = Worksheets.Item("Sheet42")

Worksheets to'plamining ob'ekti xususiyati ob'ekt funksiyasini qaytaradi, bu siz kiritgan har qanday a'zo chaqiruvi keyinchalik kechiktirilgan/ish vaqti:

Dim obj As Object
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway

VBA, ish vaqtida ob'ektning interfeysi uchun AnythingYouWantHereWillCompileAnyway kodini qidiradi va bu a'zoni topa olmaydi - bu sizning ish vaqti xatoligini qanday qo'lga kiritadi? 438 - "ob'ekt ushbu xususiyatni qo'llab-quvvatlamaydi yoki usul ".

Ushbu turdagi xavfsizlikni qayta ishlash vaqtiga (ish vaqti) emas, balki erta-bog'langan qo'ng'iroqlar bilan ishlaydigan joyga ko'chirishingiz mumkin, ya'ni Object Object/class Worksheet kodi:

Dim obj As Worksheet
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway 'nope. that won't compile anymore.

Agar siz so'rovini boshqa bir ishchi varaqqa qanday qilib belgilash mumkin? , siz Range ob'ektini manzildan boshqa narsa emas deb hisoblaysiz va bu taxmin noto'g'ri.

Agar KOffice faqat juda dir. Agar u faqat bir manzil bo'lsa, u ob'ekt emas, balki mag'lubiyatga o'xshab ketadi.

Agar manzilni ifodalovchi o'zgaruvchini istasangiz, buni string o'zgaruvchisi bilan amalga oshiring:

Dim a As String
a = "A1"

Dim r1 As Range
Set r1 = Sheet1.Range(a)

Dim r2 As Range
Set r2 = Sheet2.Range(a)
6
qo'shib qo'ydi
@ScottCraner eh, men sizning mukammal javobingizni "hujum" qilishni xohlamadim - ba'zan ba'zi kishilar o'zlarining ovozlarini qanday sarflashlari bilan hayron qoldim. Cheers!
qo'shib qo'ydi muallif Mathieu Guindon, manba
@Downvoter tezda bu "replikatsiya" makaron javobini olishni xohladi deb o'ylayman - davom eting va barcha javoblarni pastga o'tkazing, chunki men buni qilmayman.
qo'shib qo'ydi muallif Mathieu Guindon, manba
O'Rning ish vaqti xatosi 438 ning to'liq izohini kiritish uchun tahrirlangan.
qo'shib qo'ydi muallif Mathieu Guindon, manba
@Downvoter Men ushbu javobni yaxshilashni xohlayman. Unga nima bo'lganini aytib berishga jur'at et.
qo'shib qo'ydi muallif Mathieu Guindon, manba
Shunga qaramay, juda yaxshi tushuntirish va qaror qabul qilish. Men simli yondoshuvni qo'shishni o'ylab qoldim, lekin keyin band bo'ldim, faqat qaytib keldim, lekin o'shanda men sizni tark etmoqchiman.
qo'shib qo'ydi muallif Scott Craner, manba
oooooh oooooh { havoda havodagi qo'llarni to'lqinlantiradi }, men buni qilaman. 8P Shuning uchun siz ikkitangizga uchta yuksalishingiz bor
qo'shib qo'ydi muallif Scott Craner, manba
Va nima uchun bu qabul qilingan javob bo'lishi kerak. @ mathstackuser123
qo'shib qo'ydi muallif Scott Craner, manba
Hech qanday huquqbuzarlik sodir bo'lmadi, men yuqorida aytib o'tganman, juda hayajonli. Men shuni bilamanki, men etarli darajada harakat qilaman va ba'zan mening javoblarim to'liq emas. Men kulgili bo'lishga harakat qilardim. Matn hazilni to'g'ri etkazib bermaydi.
qo'shib qo'ydi muallif Scott Craner, manba
Katta javob. Ajoyib g'alati narsa
qo'shib qo'ydi muallif brettdj, manba

Manzildan foydalanishingiz mumkin:

worksheets("specificworksheet").range(r.Address).value=1 
5
qo'shib qo'ydi

Manzildan foydalanishingiz mumkin:

worksheets("specificworksheet").range(r.Address).value=1 
5
qo'shib qo'ydi

with-end with sintaksisidan foydalaning va har bir Range() (va Cells()

With Worksheets("specificworksheet")
    .Range("a1").Value = 1
    .Range("B3:C5").Value = 2
End With
2
qo'shib qo'ydi
Men ushbu javobni yaxshilashni istardim. Unga nima bo'lganini aytib berishga jur'at et. (Umid qilamanki @ Mat'sMag uning go'zal so'zlarini o'g'irlashimga umid qilmaydi)
qo'shib qo'ydi muallif user3598756, manba

with-end with sintaksisidan foydalaning va har bir Range() (va Cells()

With Worksheets("specificworksheet")
    .Range("a1").Value = 1
    .Range("B3:C5").Value = 2
End With
2
qo'shib qo'ydi
Men ushbu javobni yaxshilashni istardim. Unga nima bo'lganini aytib berishga jur'at et. (Umid qilamanki @ Mat'sMag uning go'zal so'zlarini o'g'irlashimga umid qilmaydi)
qo'shib qo'ydi muallif user3598756, manba