VBA pentru Excel – Setarea unui interval (Programare, Vba, Excel)

mathstackuser123 a intrebat.

Am o întrebare despre intervalul setat. Există ceva ce încerc și nu funcționează. Să zicem că am intervalul r, de exemplu am scris:

set r = range("a1")

Dar acest interval este valabil pentru foaia de lucru activă, de exemplu, dacă sunt pe foaia de lucru1 și scriu r.value = 1, atunci se va schimba valoarea acelei celule pe foaia de lucru activă. Acum vreau să schimb valoarea acelui interval specific pe o altă foaie de lucru. Așadar, scriu

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

Dar când scriu acest lucru, îmi spune că Object doesn’t support this propert or method. De ce? Cum pot atribui un interval (care a fost deja setat) pentru o altă foaie de lucru? În acest caz, scriind

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

mi-ar rezolva problema, însă, uneori, am un interval mai complicat, de exemplu, dacă am atribuit o celulă la r, unde am folosit cells.find(…). Apreciez orice ajutor, mulțumesc!

Comentarii

  • Felicitări pentru că nu ai ales implicit Select și Activate după ce a realizat că nu este necesar să se utilizeze Range apelurile necalificate se referă implicit la foaia activă. –  > Por Mathieu Guindon.
3 răspunsuri
Scott Craner

Ați putea utiliza Adresa:

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

Mathieu Guindon

Când o faci:

Set r = Range("A1")

Ce faci de fapt faci este aceasta:

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

Deci, declarați toate variabilele, și întotdeauna specificați Option Explicit în partea de sus a fiecărui modul – în acest fel, VBA va refuza să compileze codul care utilizează variabile nedeclarate (sau greșeli de scriere). Și declarați-vă variabilele cu un tip explicit:

Dim r As Range

A Range știe despre obiectul său Parent, care este foaia de lucru de care aparține; de aceea, așa cum ați remarcat, acest interval este valabil pentru foaia de lucru activă. Și rămâne pe acea foaie chiar dacă activați o altă foaie (ceea ce oricum nu ar trebui să faceți în 99,999% din cazuri).

De aceea nu puteți face acest lucru:

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

Pentru că r nu este un membru al grupului Worksheet ci este o variabilă de obiect locală care indică o adresă foarte specifică de pe o foaie de lucru foarte specifică. Acum, atunci când faceți Worksheets("Sheet42")accesați de fapt proprietatea implicită a obiectului Worksheets colecție, care este Item proprietate:

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

Și Worksheets colecției Item returnează un obiect Object, ceea ce înseamnă că orice apel de membru pe care îl adăugați după aceea va fi legat tardiv / rezolvat în timpul execuției:

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

În timpul execuției, VBA interoghează interfața obiectului pentru a căuta AnythingYouWantHereWillCompileAnywayși nu găsește membrul respectiv – și astfel apare eroarea de execuție 438 – „object doesn’t support this property or method”.

Puteți muta această siguranță de tip înapoi în timpul compilării (în loc de timpul de execuție) lucrând cu apeluri early-bound, adică să lucrați cu Worksheet interfață/clasă în loc de Object:

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

Când cereți cum pot atribui un interval (care a fost deja setat) pentru o altă foaie de calcul?, presupuneți că o Range obiect nu este nimic mai mult decât o adresă – iar această presupunere este greșită.

A Range este mult mai mult mult mai mult decât o adresă. Dacă ar fi fost doar o adresă, atunci ar fi fost un șir literal, nu un obiect.

Dacă doriți o variabilă care să reprezinte o adresă, puteți face acest lucru cu o variabilă String variabilă:

Dim a As String
a = "A1"

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

Dim r2 As Range
Set r2 = Sheet2.Range(a)

Comentarii

  • @Downvoter Mi-ar plăcea să îmbunătățesc acest răspuns. Vă deranjează să-mi spuneți ce este în neregulă cu el? –  > Por Mathieu Guindon.
  • Din nou, o explicație și o rezolvare mult mai bună. M-am gândit să adaug abordarea șirului, dar apoi am fost ocupat, tocmai m-am întors, dar voi lăsa așa cum este și sper că OP se schimbă la al tău. –  > Por Scott Craner.
  • Editat pentru a include o explicație mai completă a erorii de execuție 438 a OP. –  > Por Mathieu Guindon.
  • Presupun că @Downvoter a vrut un răspuns rapid „încercați acest lucru” copy-pasta – mergeți mai departe și votați toate răspunsurile mele atunci, pentru că eu nu fac asta. –  > Por Mathieu Guindon.
  • oooooh oooooh {flutură frenetic mâinile în aer}, eu fac asta. 8P Și de aceea ai trei upvotes față de cele două ale mele, în prezent –  > Por Scott Craner.
user3598756

use With-End With și precede fiecare Range() (și Cells()) de un punct

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

Comentarii

  • Downvoter Mi-ar plăcea să îmbunătățesc acest răspuns. Vă deranjează să-mi spuneți ce este în neregulă cu el? (sper că @Mat’sMag nu se va supăra că i-am furat frumoasa lui frază)  > Por user3598756.

Tags:,