Prosedyrer "Funksjon" og "Sub" i VBA. Omfanget av VBA-prosedyren. Praktisk bruk av VBA

Definisjon av VBA, fordeler, bruksmuligheter

VBA (Visual Basic for Applications) er en dialekt av Visual Basic-språket som utvider funksjonene til Visual Basic og er designet for å fungere med Microsoft Office-applikasjoner og andre applikasjoner fra Microsoft og tredjeparter.

I prinsippet, siden det ikke er overraskende, når du programmerer i Office, kan du helt klare deg uten VBA-språket. Ethvert COM-kompatibelt språk vil gjøre for eksempel vanlig Visual Basic, VBScript, JScript, C ++, Delphi, Java, etc. Du kan også bruke .NET-kompatible programmeringsspråk - VB.NET, C #, etc. Alle funksjonene til Office-applikasjonsobjektmodellene vil være fullt brukbare. Hvis du for eksempel lagrer følgende kode i en fil med filtypen * .vbs og kjører den for kjøring, vil Word starte, et nytt dokument åpnes i den, og teksten skrives ut:

Sett oWord = CreateObject ("Word.Application")

oWord.Visible = sant

oWord.Documents.Add

oWord.Selection.TypeText ("Hei fra VBScript")

Imidlertid er VBA vanligvis det mest praktiske språket for å jobbe med Office-applikasjoner.

Hovedårsaken er enkel - VBA er innebygd i Office-applikasjoner (og ikke bare), og VBA-kode kan lagres i Office-applikasjonsdokumenter - Word-dokumenter, Excel-arbeidsbøker, PowerPoint-presentasjoner, etc. Selvfølgelig kan denne koden kjøres derfra for kjøring, siden kjøringsmiljøet for VBA-kode (i programmeringsslang - vert) er innebygd i disse applikasjonene.

For øyeblikket er VBA innebygd i:

  • til alle hovedprogrammer i MS Office - Word, Excel, Access, PowerPoint, Outlook, FrontPage, InfoPath;
  • Andre Microsoft-applikasjoner som Visio og Microsoft Project
  • i over 100 tredjepartsapplikasjoner som CorelDraw og CorelWordPerfect Office 2000, AutoCAD, etc.

VBA har også mange andre fordeler:

VBA er et universelt språk. Etter å ha mestret det, vil du ikke bare få nøkkelen til alle funksjonene til Office-applikasjonene og andre som er oppført ovenfor, men du vil også være klar til å:

  • lage fullverdige applikasjoner i Visual Basic (siden disse språkene er nære slektninger);
  • bruk alle funksjonene til VBScript-språket (dette er vanligvis en nedstrippet VBA). Som et resultat vil du ha universelle verktøy til disposisjon for å lage Windows-administrasjonsskript (mer om dette på slutten av kurset), for å lage websider (VBScript i Internet Explorer), for å lage ASP-webapplikasjoner, for bruk i DTS pakker og oppgaver på MS SQL Server, for å lage serverskript Exchange Server og mye, mye mer.

VBA var opprinnelig rettet mot brukere, ikke profesjonelle programmerere (selv om fagfolk bruker det veldig aktivt), så du kan lage programmer med det veldig raskt og enkelt. I tillegg har Office innebygde kraftige verktøy for å gjøre brukeropplevelsen enklere: objekt- og syntakstips, makroopptaker og mer.

Når du oppretter applikasjoner i VBA, trenger du mest sannsynlig ikke å bekymre deg for å installere og sette opp et spesielt programmeringsmiljø og tilstedeværelsen av de nødvendige bibliotekene på brukerens datamaskin - MS Office er tilgjengelig på nesten hvilken som helst datamaskin.

Mens VBA-applikasjoner ofte kjører tregere enn du ønsker, er de lette og fungerer veldig bra, for eksempel på en terminalserver. Men som regel er det ingen spesielle ytelseskrav for VBA-programmer: de brukes ikke til å skrive spill, drivere, serverprodukter. Etter min erfaring er ytelsesproblemer i VBA-applikasjoner for det meste ikke VBA-problemer, men problemer med databasene de har tilgang til. Hvis problemene virkelig er i VBA (vanligvis når du trenger kompleks matematikk), så er det alltid mulighet for å skrive viktig kode i C++ og referere til den som en vanlig DLL eller en tilleggsapplikasjon (Add-In) for Word, Excel, Access osv. .NS.

VBA-programmer er ikke kompilert som standard, så det er veldig praktisk å gjøre rettelser til dem. Det er ikke nødvendig å søke etter kildekoder og rekompilere programmer.

Blant profesjonelle programmerere antas det at den korteste veien "fra scratch" og programmer som "Hello, World" til profesjonelle programmer som lages på bestilling er gjennom Office-VBA-pakken (og selvfølgelig ikke gjennom C ++, Java eller Delphi) ...

VBA til Excel

Excel-programmering med VBA.

VBA lar deg skrive makroer i Excel. Hvordan du gjør dette er diskutert nedenfor.

applikasjon

Applikasjon er objektet øverst i objekthierarkiet i Excel. Søknaden er Excel. Her er eksempler på bruk av applikasjon:

normal størrelse vindu

Application.WindowState = xlNormal

maksimalt vindu

Application.WindowState = xlMaximized

Arbeidsbøker

Arbeidsbøker er en samling arbeidsbøker som er åpne. Hver arbeidsbok er representert av et arbeidsbokobjekt. Du kan finne ut hvor mange arbeidsbøker som for øyeblikket er i samlingen, slik:

Dim bokTell som heltall
bookCount = Workbooks.Count
MsgBox ("Åpnede bøker =" & bookCount)

Du kan besøke den nødvendige arbeidsboken i Arbeidsboksamlingen etter nummeret eller navnet:

Arbeidsbøker.Punkt (2) .Aktiver

her har vi aktivert det andre elementet i Workbooks-samlingen.

Vi vil se andre eksempler nedenfor.

Arbeidsbok

Arbeidsbøker.Element (1) .Lagre

Og hvor er arbeidsboken i dette eksemplet? Her: Workbooks.Item (1), dette uttrykket returnerer det første elementet i Workbooks-samlingen, som er Workbook.

Lukk arbeidsbok:

Arbeidsbøker.Punkt (1) .Lukk

Ark

Ark er alle ark i en arbeidsbok. Det finnes to typer arbeidsbokark: regneark er vanlige Excel-ark og den andre typen er diagramark. Begge utgjør Sheets-samlingen.

Diagrammer

Diagrammer er bare arbeidsbokdiagrammer.

Diagram

Diagram er et objekt som representerer et enkelt diagram. Hvis diagrammet finnes i et normalt regneark, er det ikke et diagramobjekt.

Arbeidsark

Regneark er bare arbeidsbok-regneark.

Legg til et regneark i regnearksamlingen:

Arbeidsark

Regneark er ett ark i en Excel-arbeidsbok.

Alle cellene i regnearket:

Regneark ("Ark1"). Celler

Område. Arbeide med celler i Excel

Område er én celle i et regneark eller flere celler. La oss vurdere dette objektet mer detaljert. Installer knappen på et Excel-regneark. Åpne "Kontroller"-verktøylinjen (høyreklikk på det ledige feltet på verktøylinjen og velg fra rullegardinmenyen). I dette panelet velger du knappen og setter den til ledig plass i regnearket på høyre side. Høyreklikk på knappen vår -> Egenskaper. Sett Name-egenskapen til CommandButton og Caption-egenskapen til Range Test.

Vi får:

Lukk egenskapsvinduet for knapper, og klikk på knappen vår med høyre museknapp, velg "Kildetekst" fra rullegardinmenyen. VBA-redigeringsvinduet åpnes, det kalles Microsoft Visual Basic. Den har allerede en mal for behandleren for å trykke på kommandoknappen:

Ta forresten en titt på denne malen, Sub-nøkkelordet sier at dette er en prosedyre, og ordet Privat indikerer at denne prosedyren kun er synlig i denne modulen.

Vi er alle klar til å begynne å lære å jobbe med celler i et Excel-regneark.

Hvordan stille inn den aktive cellen?

La oss gjøre celle A2: A2 aktiv:

Private Sub CommandButton_Click ()
Område ("A2: A2"). Aktiver
End Sub

Lær mer om hva du kan gjøre i VBA

Ovenfor, under Hvorfor bry seg med VBA?, nevnte jeg hvordan du kan bruke VBA til å forbedre eksisterende applikasjoner. Det er på tide å diskutere dette mer detaljert, slik at det endelig blir klart for deg hva du kan få fra VBA.

Før jeg tar fatt på våre felles planer for store forbedringer, vil jeg påpeke at hva du får fra VBA avhenger av applikasjonen du jobber med. Noen programmer lar deg omdefinere nesten alle elementer i brukergrensesnittet og hver innebygde kommando, og gir dermed en overflod av byggematerialer som du kan konstruere nye muligheter fra. I andre applikasjoner er valget mye knappere.

Tilpasse brukergrensesnittet

En av de mest åpenbare situasjonene der du bør bruke VBA er å endre brukergrensesnittet til applikasjonen din for å gjøre den mer kjent og praktisk for deg.

(Bare i tilfelle, vil jeg merke at brukergrensesnittet betyr hvordan programmet ser ut på skjermen, hvordan musen, tastaturet og andre ulike midler som tilbys av programmet for deg, brukeren, til å samhandle med programvaren.) I mange applikasjoner , lar VBA deg endre elementers brukergrensesnitt slik det er praktisk. Med bare noen få linjer med kode kan du legge til, fjerne eller endre den relative plasseringen av knapper på verktøylinjer, opprette nye verktøylinjer, overstyre tastaturoppsettet eller endre menystrukturen. I fig. 1.1 viser et Microsoft Word-vindu, med tillatelse fra et modifisert VBA-brukergrensesnitt.

Du trenger VBA hvis du vil jobbe med Word-dokumenter på en blank skjerm, helt fri for alle verktøylinjer

Du bør selvfølgelig ikke bruke en blåselampe der fyrstikker fungerer – for de enkleste UI-endringene er VBA ofte et for kraftig verktøy. Mange av dagens applikasjoner lar deg endre grensesnittet uten programmering i det hele tatt - ved hjelp av dra og slipp eller dialogbokser.

Imidlertid er VBA også nyttig for slike applikasjoner. På den ene siden kan til og med applikasjoner som er ekstremt vennlige i denne forstand ikke endre noen deler av grensesnittet uten hjelp fra VBA. På den annen side, og enda viktigere, lar VBA deg organisere hele grupper med automatiske brukergrensesnittendringer akkurat på arbeidstidspunktet – avhengig av hva du gjør med programmet for øyeblikket.

Anta at du jobber med beløp på over en million dollar, samtidig som du bruker de samme tre verktøylinjene. Med VBA kan du lage et program som vil åpne disse verktøylinjene sammen og deretter skjule dem samtidig når du ikke trenger dem.

Så langt har jeg snakket om å endre brukergrensesnittet til en VBA-applikasjon, men ikke om å lage brukergrensesnittet til selve VBA-programmet. Mens mange VBA-programmer er automater som fungerer uten innblanding fra din side, vil det uunngåelig komme en tid da du trenger å lage dine egne dialogbokser og andre vinduer (VBA bruker den generelle termen for disse).

Fra boken La oss bygge en kompilator! forfatter Crenshaw Jack

Fra boken Accelerate Your Site forfatteren Matsievsky Nikolay

La oss se nærmere på fig. 3.1. Diagram over forhåndssjekk og ettersjekk Når nettleseren mottar en forespørsel om å åpne en ressurs som er i hurtigbufferen, og hurtigbufferen inneholder Cache-Control-utvidelsene (sendt fra serveren som en del av HTTP-svarhodet), så IE bruker disse

Fra boken Win2K FAQ (v. 6.0) forfatteren Shashkov Alexey

(1.13) Er det mulig å lage W2kServer ut av W2kPro, og hvorfor er det nødvendig? Kan. Skjønt ikke :-) For dette er det et program som heter NTSwitch. Alt den gjør er å lagre en kopi av registeret ditt, redigere det og gjenopprette det. På grunn av det faktum at de forskjellige versjonene

Fra AutoCAD 2009 studentbok. Selvinstruksjonsbok forfatteren Sokolova Tatiana Yurievna

(5.4) I 1C Regnskap 6 vises kruseduller i stedet for russiske bokstaver, hva kan gjøres med dette? Dette er fordi Microsoft endret navnet på MS SANS SERIF-fonten til MICROSOFT SANS SERIF, som et resultat av at 1C Accounting ikke kan finne den. For å løse problemet er det nok å endre

Fra bok Legg i handlekurv. Nøkkelprinsipper for å øke nettstedkonverteringer forfatteren Eisenberg Jeffrey

Fra AutoCAD 2009. Opplæring forfatteren Sokolova Tatiana Yurievna

Mer om psykologiske typer Type temperament til kjøper avhenger av hvilke spørsmål han leter etter svar, hvilken informasjon han trenger og hvordan han bruker tiden sin når han skal ta beslutninger Det er flere generelle mønstre: - personer med en metodisk type er interessert i svaret på

Fra AutoCAD 2008 Student: En populær selvstudieveiledning forfatteren Sokolova Tatiana Yurievna

Mer om malen Et sett med øktparametere kan gjøres tilgjengelig for bilder som du lager senere. For å gjøre dette må du lagre dokumentet som en mal. Malen er vanligvis en tegning som ikke inneholder noen grafiske objekter og

Fra boken Promotion: Secrets of Effective Website Promotion forfatteren Evdokimov Nikolay Semenovich

Mer om malen Et sett med øktparametere kan gjøres tilgjengelig for bilder som du lager senere. For å gjøre dette må du lagre dokumentet som en mal. Malen er vanligvis en tegning som ikke inneholder noen grafiske objekter og

Fra boken DirectX Graphics in Delphi forfatteren Krasnov Mikhail

Mer om liming Liming er prosessen med å identifisere flere dokumenter som kopier av en søkemotor, som et resultat av at bare én av dem (en av sidene) blir igjen i søkeresultatene. Når kopier er funnet, kan søkemotoren lime sider fra ett nettsted eller fra forskjellige

Fra boken Digitalt magasin "Computera" № 197 forfatteren Computerra magasinet

Fra boken Programmering for Linux. Profesjonell tilnærming forfatter Mitchell Mark

Tre konklusjoner som kan trekkes etter å ha diskutert årsakene til forskjellene mellom mennesker i deres hudfarge Dmitry Shabanov Publisert 31. oktober 2013 De to foregående generelle spaltene ble viet til analysen av ett, i, et veldig enkelt tegn på en person -

Fra C++-boken for nybegynnere forfatter Lippman Stanley

4.1.4. Lær mer om trådidentifikatorer Noen ganger blir det nødvendig for et program å finne ut hvilken tråd som kjører den. Funksjonen pthread_self () returnerer identifikatoren til tråden den kalles på. For å sammenligne to forskjellige identifikatorer er det ment

Fra boken How They Test on Google forfatteren Whittaker James

9.3.1. Mer om eksakt samsvar Det enkleste tilfellet oppstår når typene av de faktiske argumentene er de samme som typene av de formelle parameterne. For eksempel er det to overbelastede maks () funksjoner vist nedenfor. Da samsvarer hvert av kallene til maks () nøyaktig én

Fra forfatterens bok

Fra forfatterens bok

Fra forfatterens bok

Litt mer om Buganizer Den eldste feilen rapportert av Google ble opprettet 18. mai 2001 kl. 15:33 og eksisterer fortsatt i dag. Den heter "Test Bug" og beskrivelsen ser ut som "First Bug!" Det er morsomt at denne feilen fortsatt dukker opp ved et uhell når utviklere binder seg

Det er situasjoner når et VBA-program kreves for å utføre det samme settet med handlinger flere ganger på rad (det vil si gjenta den samme kodeblokken flere ganger). Dette kan gjøres ved hjelp av VBA-løkker.

VBA-løkker inkluderer:

  • For loop
  • Gjør mens loop
  • Gjør til syklus

For Loop Operator i Visual Basic

Strukturen til sløyfeoperatøren Til i Visual Basic kan organiseres i en av to former: som en loop For ... Neste eller som en løkke For hver.

Syklus "For ... Neste"

Syklus For ... Neste bruker en variabel som sekvensielt tar verdier fra et gitt område. Med hver endring av verdien til variabelen utføres handlingene som er innesluttet i syklusens kropp. Dette er lett å forstå fra et enkelt eksempel:

For i = 1 til 10 Totalt = Totalt + iArray (i) Neste i

I denne enkle løkken For ... Neste variabel brukes Jeg, som sekvensielt tar verdiene 1, 2, 3, ... 10, og for hver av disse verdiene utføres VBA-koden inne i løkken. Dermed summerer denne sløyfen elementene i matrisen. iArray i variabel Total.

I eksemplet ovenfor er løkkeøkningen ikke spesifisert, så for å øke variabelen Jeg fra 1 til 10, inkrementer brukes som standard. I noen tilfeller er det imidlertid nødvendig å bruke forskjellige inkrementverdier for løkken. Dette kan gjøres ved å bruke nøkkelordet Steg som vist i følgende enkle eksempel.

For d = 0 Til 10 Trinn 0.1 dTotal = dTotal + d Neste d

Siden i eksemplet ovenfor er inkrementtrinnet satt lik 0.1 , deretter variabelen dTotalt for hver repetisjon av syklusen antar verdiene 0,0, 0,1, 0,2, 0,3,… 9,9, 10,0.

For å bestemme løkketrinnet i VBA, kan du bruke en negativ verdi, for eksempel slik:

For i = 10 til 1 trinn -1 iArray (i) = i Neste i

Her er økningen -1 , så variabelen Jeg med hver repetisjon av syklusen får verdiene 10, 9, 8, ... 1.

Loop "For Every"

Syklus For hver ligner på en syklus For ... Neste, men i stedet for å iterere over sekvensen av verdier for tellervariabelen, loopen For hver utfører et sett med handlinger for hvert objekt i den angitte gruppen av objekter. I følgende eksempel bruker du en løkke For hver oppregner alle ark i gjeldende Excel-arbeidsbok:

Dim wSheet som regneark for hvert wSheet i regneark MsgBox "Ark funnet:" & wSheet.Name Neste wSheet

Sløyfeavbruddserklæring "Avslutt for"

Operatør Avslutt for brukes til å avbryte syklusen. Så snart denne setningen påtreffes i koden, avslutter programmet kjøringen av løkken og fortsetter til kjøringen av setningene som er i koden umiddelbart etter denne løkken. Dette kan for eksempel brukes til å søke etter en bestemt verdi i en matrise. For å gjøre dette, ved hjelp av en løkke, skannes hvert element i matrisen. Så snart det nødvendige elementet er funnet, er det ikke nødvendig å se gjennom resten - syklusen avbrytes.

Operatørapplikasjon Avslutt for vist i følgende eksempel. Her itererer loopen over 100 array-oppføringer og sammenligner hver med verdien til variabelen dVal... Hvis en match blir funnet, avsluttes loopen:

For i = 1 Til 100 Hvis dValues ​​(i) = dVal Så IndexVal = i Avslutt For End If Next i

Do While-løkken i Visual Basic

Syklus Gjør mens kjører en kodeblokk så lenge den angitte betingelsen er oppfylt. Følgende er et eksempel på en prosedyre Under, der bruker løkken Gjør mens Fibonacci-tall som ikke overstiger 1000 vises sekvensielt:

"Subprosedyre gir ut Fibonacci-tall som ikke overstiger 1000 Sub Fibonacci () Dim i As Integer" teller for å indikere posisjonen til et element i sekvensen Dim iFib As Integer "lagrer gjeldende verdi av sekvensen Dim iFib_Next As Integer" lagrer neste verdi av sekvensen Dim iStep As Integer "lagrer størrelsen på neste inkrement "initialiser variablene i og iFib_Next i = 1 iFib_Next = 0" Do While-løkken vil kjøres til verdien "for det gjeldende Fibonacci-tallet overstiger 1000 Do While iFib_Next< 1000 If i = 1 Then "особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else "сохраняем размер следующего приращения перед тем, как перезаписать "текущее значение последовательности iStep = iFib iFib = iFib_Next End If "выводим текущее число Фибоначчи в столбце A активного рабочего листа "в строке с индексом i Cells(i, 1).Value = iFib "вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

I det gitte eksempelet, betingelsen iFib_Next< 1000 sjekket i begynnelsen av syklusen. Derfor, hvis den første verdien iFib_Next ville være mer enn 1000, så ville løkken aldri bli utført.

En annen måte å implementere en loop Gjør mens- Plasser tilstanden ikke i begynnelsen, men på slutten av syklusen. I dette tilfellet vil sløyfen bli utført minst én gang, uavhengig av om betingelsen er oppfylt.

En slik syklus er skjematisk Gjør mens med en sjekket tilstand på slutten vil det se slik ut:

Gjør ... Loop mens iFib_Next< 1000

Do Until-løkken i Visual Basic

Syklus Gjør til veldig lik en løkke Gjør mens: kodeblokken i løkkens kropp utføres om og om igjen til den spesifiserte betingelsen er oppfylt (resultatet av det betingede uttrykket er ekte). I neste prosedyre Under ved hjelp av en løkke Gjør til henter verdier fra alle cellene i en kolonne EN regneark til det er en tom celle i kolonnen:

IRow = 1 Do Until IsEmpty (Cells (iRow, 1)) "Verdien av gjeldende celle er lagret i matrisen dCellValues​dCellValues​(iRow) = Celler (iRow, 1) .Value iRow = iRow + 1 Loop

I eksemplet ovenfor, tilstanden IsEmpty (celler (iRow, 1)) er i begynnelsen av strukturen Gjør til, derfor vil sløyfen bli utført minst én gang hvis den første cellen som tas ikke er tom.

Imidlertid, som vist i loop-eksemplene Gjør mens, i noen situasjoner er det nødvendig at løkken kjøres minst én gang, uavhengig av det første resultatet av det betingede uttrykket. I dette tilfellet bør det betingede uttrykket plasseres på slutten av løkken, slik:

Gjør ... Loop Til IsEmpty (Cells (iRow, 1))

Leksjonen er utarbeidet for deg av teamet på nettstedet office-guru.ru
Kilde: /> Oversatt: Anton Andronov

Flere Microsoft Excel-veiledninger

For Loop i VBA er en av de mest populære loopene i Excel. Denne syklusen har to former - For neste og For hver i neste. Disse operatorene brukes til å flytte sekvensielt gjennom en liste med elementer eller tall. For å avslutte sløyfen kan vi bruke exit-kommandoen når som helst. La oss se nærmere på hver av disse syklusene.

VBA for neste sløyfe

For Next-løkken har følgende syntaks:

Det vi gjør her er egentlig å lage en løkke som bruker en variabel disk som en vokter av tiden. Vi setter verdien lik start_counter, og øk (eller reduser) med 1 i løpet av hver sløyfe. Løkken vil kjøre til verdien disk vil ikke være lik sluttteller. Når begge disse verdiene samsvarer, vil løkken kjøres en siste gang og stoppe.

Eksempel på løkke

disk vil være lik 11

VBA For Loop med STEP-setning

Hvis du trenger å gå fra en høyere verdi til en lavere, kan du bruke løkken i motsatt retning. Her er et eksempel på en omvendt loop:

Den siste verdien av variabelen disk vil være lik 1.

Som du kanskje har lagt merke til, kan vi bruke instruksjonen Stegn for at syklusen skal fungere både forover og bakover. Standard er Steg er lik 1, men det kan endres hvis det er nødvendig å hoppe over noen verdier, da vil verdien av n være større enn én, eller bevege seg i motsatt retning, da vil n være negativ.

VBA for hver ... neste sløyfe

For hver ... Neste løkke har følgende løkke:

Her variabel gruppeelement tilhører item_group(jernlogikk!!!). Jeg mener at objektet item_group skal være en samling av gjenstander. Du vil ikke kunne kjøre en For Every-løkke på et enkelt objekt (Microsoft vil umiddelbart varsle deg om dette med feil 438).

Denne loopen gjentar alle elementene i en samling, fra den aller første. Du kan bruke denne løkken hvis du for eksempel trenger å gå gjennom alle ark i en arbeidsbok, objekter på et ark, pivottabeller osv.

Her er et eksempel på hvordan du kan bruke en For Every-løkke til å gå gjennom alle arkene i en arbeidsbok:

... eller alle pivottabeller på arket

Bryte en VBA-løkke

Hvis du trenger å gå ut av loopen før slutten av loopen er nådd, bruk kommandoen SluttTil i forbindelse med instruksjoner HVIS. I eksemplet nedenfor vil vi gå ut av sløyfen til termineringsbetingelsen er nådd; i denne sløyfen vil avslutningen utføres på betingelse av at variabelen disk vil er lik 3.

Hopp over en del av en loop i For Every

Det er dårlig praksis å hoppe over en del av loopen og deretter gå tilbake. La oss imidlertid se på et eksempel:

Her hoppet vi over én iterasjon (når j = 3). Hvilket resultat tror du programmet vil gi? 3? 5? Vel ... faktisk er ingen av alternativene riktige. Sløyfen vil kjøre på ubestemt tid til datamaskinens minne blir fullt.

Det er imidlertid mulig å hoppe over et trinn i løkka uten konsekvenser. Du kan øke tellerverdien med 1 (eller en annen verdi), som vil hoppe over operasjoner mellom disse verdiene. Her er et eksempel:

Men igjen, dette er dårlig kodingspraksis og kan føre til uønskede konsekvenser ved koding i fremtiden. I stedet, hvis du trenger å hoppe over noen iterasjoner, prøv å bruke If-funksjonen eller Velg sak.

Excel VBA. Sløyfe i en makro

La oss lage den enkleste syklusen ved å bruke VBA i Excel.

Denne gangen vil vi skrive alt med egne hender:

Sub Fylling () "Vi starter syklusen fra 1 til 10" Begynnelsen av syklusen For i = 1 Til 10 "I den første kolonnen skriver vi serienummeret Celler (i + 1, 1) = i" I den andre kolonnen vi skriver produktet av serienummeret og verdien spesifisert i cellen "B1" Celler (i + 1, 2) = i * Range ("b1"). Verdi "(! LANG: Slutt på syklus Next End Sub

Jeg vil dekode VBA-koden ovenfor:

  • All makrokode er innelukket mellom Sub og End Sub, etter at Sub er skrevet navnet på makroen.
  • Tekst etter 'betyr en kommentar
  • Løkken er mellom For ... to og Next
  • i - i mitt tilfelle, en variabel, kan du velge hvilken som helst annen, inkludert russisk notasjon (for eksempel: For variabel = 1 til 10 ...)
  • Celler (rad, kolonne) - en celle som vi vil skrive noe til eller som vi vil trekke ut informasjon fra, i vårt tilfelle spesifiserte vi kolonnen som en konstant (1 og 2), og gjorde raden til en variabel (i + 1).
  • Område ("b1") returnerer verdien til celle "B1"

Du kan også umiddelbart legge til en minimac for å fjerne verdiområdet

Sub Clear () område ("A2:B11").ClearContents End Sub !}

God dag! Jeg bestemte meg for å vie denne artikkelen til overskriften om det grunnleggende om programmering i Visual Basic for applikasjon... Og i dag skal vi snakke om løkker i VBA, vi vil analysere syntaksen deres og vurdere noen få eksempler som ofte møter en programmerer.

La meg først minne deg på det syklus- prosessen med repetisjon av en del av koden, utført til betingelsen vi spesifiserte er oppfylt eller brutt.

I denne artikkelen vil vi analysere syntaksen og eksempler på følgende løkker i VBA:

  • For hver
  • Samtidig som
  • Før

For Loop in VBA

Syklus til i VBA, brukes det vanligvis når du sløyfer et stykke kode, hvis vi vet den endelige verdien av telleren - telleren der vi vil gå ut av løkken.
La oss ta det vanligste eksemplet for eksempel:

Generer en matrise med 5 heltall

Dim mas (5) Som heltall For i% = 0 Til 4 mas (i) = Int ((10 * Rnd) + 1) Neste i

Merk at dette eksemplet bruker en implisitt erklæring når du arbeider med løkker i VBA. Jeg%- betyr implisitt variabeldeklarasjon Jeg i heltallsformat. Denne konstruksjonen erstatter i hovedsak følgende: dim i som heltall. Dette brukes for å holde koden kort og for enkel skriving og lesing. I eldre versjoner av VBA må du oppgi et formattegn etter hver bruk av den implisitte variabelen. I senere versjoner er bare én nok.

VBA for loop til gjør det mulig å bruke funksjonen Steg... Som det fremgår av oversettelsen, er dette trinnet vi skal gå gjennom intervallet vårt med. Som standard er det 1. Et populært brukstilfelle er når telleren er bundet til en variabel som brukes inne i en loop. For eksempel når du skriver programmer relatert til funksjoner.

Finn skjæringspunktet mellom Y = 5 * x + 5-grafen med Y-aksen

Funksjon uttr (x Som heltall) Som heltall uttr = 5 * x + 5 Sluttfunksjon Sub CodeTown () Dim i Som heltall For i = -10 Til 10 Trinn 1 Hvis uttr (i) = 0 Så MsgBox "For Y = 0, X = "+ CStr (i) Neste i End Sub

La oss nå forestille oss at vi har et ganske stort utvalg, og vi vil ikke tvinge datamaskinen til å telle unødvendige iterasjoner. I dette tilfellet er det en kommando Avslutt for... La oss omskrive vårt siste eksempel med en ny kommando.

Funksjon uttr (x Som heltall) Som heltall uttr = 5 * x + 5 Sluttfunksjon Sub CodeTown () Dim i Som heltall For i = -10 Til 10 Trinn 1 Hvis uttr (i) = 0 Så MsgBox "For Y = 0, X = "+ CStr (i) Exit For End If Next i End Sub

Ved å bruke kommandoen Exit du kan avslutte hvilken som helst loop i VBA. Det er nok å indikere etter Exit navnet på syklusen som brukes. Det er også mulig for dem å avslutte enhver prosedyre eller funksjon.

For hver sløyfe i VBA


For hver i VBA er basert på iterasjon over alle elementer av en spesifisert type i en matrise, et objekt eller en gruppe.
Den mest populære bruken er å iterere over sider i en arbeidsbok.

Vis titlene på alle arkene i en arbeidsbok

For hver ws In ThisWorkbook.Worksheets MsgBox ws.Name Next ws

Og et annet interessant eksempel:

Endre skriftstørrelsen og sentrer teksten i etiketten

For hvert element i UserForm1.Controls If InStr (1, UserForm1.Controls.Item (i%). Navn, "Label")> 0 Then UserForm1.Controls.Item (i%). TextAlign = fmTextAlignCenter UserForm1.Controls.Item ( i%) Font.Size = 20 i% = i% + 1 End If Next element

Her skal det forstås at gjennom Kontroller du kan referere til et hvilket som helst element i skjemaet. Hvis du for eksempel filtrerer etter navn, som vi gjorde ovenfor, kan du velge grupper av elementer og endre egenskapene deres. I dette tilfellet, skriftstørrelsen og justeringen.

Mens loop i VBA


Løkker i VBA som bruker en struktur Gjør..løkke(dette er samtidig som og før sykluser) kan skrives med forskjellige plasseringer av tilstandsfragmentet. Som du kan se på bildet ovenfor, kan tilstanden sjekkes etter å ha utført én iterasjon, eller kanskje før du starter loopen.
Det mest populære eksemplet:

Sorter i stigende rekkefølge den genererte matrisen med boblemetoden

Dim mas (5) Som heltall For i% = 0 Til 4 mas (i%) = Int ((10 * Rnd) + 1) Neste i Dimtall Som heltall, temp Som heltall = 1 Do While count> 0 count = 0 For i% = 0 Til 3 Hvis mas (i)> mas (i + 1) Da temp = mas (i) mas (i) = mas (i + 1) mas (i + 1) = temp count = count + 1 End If Next i% Loop

I eksemplet ovenfor har vi sortert matrisen med tilfeldige verdier i stigende rekkefølge. Boblemetoden anses å være ganske lang, men enkel å implementere. I utgangspunktet er de sortert etter små numeriske matriser.

Inntil Loop i VBA


Som du kan se, forskjellene fra samtidig som ekstremt ubetydelig. Syklus Før i VBA kan implementeres ved hjelp av konstruksjonen mens IKKE (tilstand)... Men her er et eksempel:

Tving brukeren til å skrive inn et tall

Dim temp Som Variant Gjør temp = InputBox ("Skriv inn et tall") Loop Til IsNumeric (temp)

Hvorfor tvinge? For hvis brukeren lukker inndatavinduet, vil det ikke lagre ham, det vil dukke opp igjen og igjen til han skriver inn et hvilket som helst tall.

Det er her vi skal avslutte. I dag så vi på det viktige temaet loops i VBA, tok fra hverandre hovedeksemplene. Selvfølgelig er alle eksemplene om dette enorme emnet vanskelige å finne ut, men likevel bør du forstå det grunnleggende. Legg igjen kommentarer hvis du har spørsmål.
Last ned kilde

For ... Neste loop i VBA Excel, dens syntaks og beskrivelse av individuelle komponenter. Eksempler på bruk av For ... Next loop.

For... Next-løkken i VBA Excel er designet for å utføre en gruppe setninger det nødvendige antallet ganger, spesifisert av løkkens kontrollvariabel, telleren. Når løkken kjører, øker eller reduseres telleren etter hver iterasjon med tallet spesifisert av Step-setningen, eller, som standard, med én. Når du trenger å bruke en sløyfe på elementer hvis nummer og indeksering i en gruppe (rekkevidde, array, samling) er ukjent, bør du bruke For Every... Next-løkken.

  1. For ... Syntaks for neste sløyfe
  2. For ... Next Loop-komponenter
  3. Eksempler på For ... Next Loops
    • Den enkleste syklusen
    • Den enkleste løkken med et trinn
    • Løkke med negative argumenter
    • Nestet løkke
    • Går ut av loopen
    • Løkke med brøkargumenter

For ... Syntaks for neste sløyfe

For teller = start Til slutt Neste For teller = start Til slutt Neste

Klammerne indikerer de valgfrie attributtene til For ... Next loop.

For ... Next Loop-komponenter

Komponent Beskrivelse
disk Obligatorisk attributt. En numerisk variabel som fungerer som en teller, som også kalles en sløyfekontrollvariabel.
start Obligatorisk attributt. Numerisk uttrykk som spesifiserer startverdien for telleren.
slutt Obligatorisk attributt. Numerisk uttrykk som spesifiserer sluttverdien til telleren.
Steg * Valgfritt attributt. En operatør som indikerer at løkketrinnet vil bli spesifisert.
steg Valgfritt attributt. Numerisk uttrykk som spesifiserer trinnet i løkken. Det kan være enten positivt eller negativt.
uttalelser Valgfritt **-attributt. Operatører av koden din.
Avslutt for Valgfritt attributt. Utsagnet om å gå ut av loopen til den slutter.
Neste Her disk- valgfritt attributt. Dette er det samme navnet på sløyfekontrollvariabelen og kan utelates her.

* Hvis attributt Steg ikke er tilstede, kjører For... Next loop med standardtrinn på.

** Hvis du ikke bruker koden din i loopen, går betydningen av å bruke loopen tapt.

Eksempler på For ... Next Loops

Du kan kopiere prøveløkkene inn i VBA-modulen, kjøre dem sekvensielt og se resultatene.

Den enkleste syklusen

Vi fyller de ti første cellene i den første kolonnen i det aktive arket med tall fra 1 til 10:

Sub test1 () Dim i så lenge for i = 1 til 10 celler (i, 1) = i Next End Sub

Den enkleste løkken med et trinn

Trinn-operatoren med verdien 3 ble lagt til forrige løkke, og resultatene skrives til den andre kolonnen:

Undertest2 () Dim i så lenge for i = 1 til 10 Trinn 3 Celler (i, 2) = i Next End Sub

Løkke med negative argumenter

Denne løkken fyller de ti første cellene i den tredje kolonnen i omvendt rekkefølge:

Sub test3 () Dim i Så lenge For i = 0 Til -9 Trinn -1 Celler (i + 10, 3) = i + 10 Neste Slutt Sub

Øk trinnstørrelsen til -3 og skriv resultatene til den fjerde kolonnen i det aktive arket:

Sub test4 () Dim i Så lenge for i = 0 Til -9 Trinn -3 Celler (i + 10, 4) = i + 10 Neste Slutt Sub

Nestet løkke

Den ytre løkken setter sekvensielt indeksene for de første ti radene i det aktive arket, og den nestede løkken legger til tallene i de fire første cellene i raden med gjeldende indeks og skriver summen til cellen i den femte kolonnen. Før vi starter den nestede syklusen med kumulativ addisjon, nullstiller vi den femte cellen i den tilsvarende raden, slik at hvis et tall er funnet i den, vil det ikke bli lagt til det totale beløpet.

Deltest5 () Dim i1 så lenge, i2 så lenge for i1 = 1 til 10 "Den femte cellen i linje i1 er tildelt 0 celler (i1, 5) = 0 For i2 = 1 til 4 celler (i1, 5) = celler (i1, 5) + Celler (i1, i2) Next Next End Sub

Går ut av loopen

I den sjette kolonnen i det aktive arket skriver vi ned navnene på ti dyr, selvfølgelig, ved å bruke For ... Next loop:

Deltest6 () Dim i så lenge for i = 1 til 10 celler (i, 6) = Velg (i, "Bear", "Elephant", "Siraffe", "Antelope", _ "Crocodile", "Sebra", "Tiger", "Lizard", "Lion", "Hippopotamus") Next End Sub

Den neste syklusen vil søke i den sjette kolonnen til krokodillen som spiste kalosjene. I cellen i den syvende kolonnen vil syklusen, til den møter en krokodille, skrive linjen "Det var en syklus", og når den finner en krokodille, vil den skrive "Han spiste kalosjer" og slutte å virke ved å utføre Exit For kommando. Dette vil sees i cellene ved siden av navnene på dyrene under krokodillen, som ikke vil inneholde teksten "Det var en syklus".

Deltest7 () Dim i så lenge for i = 1 til 10 hvis celler (i, 6) = "Krokodille" Så celler (i, 7) = "Han spiste kalosjer" Avslutt for andre celler (i, 7) = "Her det var en syklus "End If Next End Sub

Resultatet av For ... Next-løkkene fra eksemplene:

Resultatet av For ... Next loops

Du vil få slike data på det aktive Excel-arket hvis du sekvensielt kjører for kjøring i VBA-editoren alle syv rutinene fra eksemplene som demonstrerer driften av For ... Next loops.

Løkke med brøkargumenter

Start-, slutt- og trinnattributtene kan representeres av et tall, en variabel eller et numerisk uttrykk:

For i = 1 Til 20 Trinn 2 For i = a Til b Trinn c For i = a - 3 Til 2b + 1 Trinn c / 2

Som et resultat av å evaluere verdien av en variabel utenfor løkken eller et uttrykk inne i den, kan et brøkresultat oppnås. VBA Excel vil avrunde det til nærmeste hele tall ved å bruke regnskapsavrunding:

"Attributtverdier før avrunding For i = 1,5 til 10,5 trinn 2,51" Attributtverdier avrundet For i = 2 til 10 Trinn 3

Prøv å ikke la uavrundede argumentverdier komme inn i kroppen til For ... Next loop, for ikke å få uforutsigbare resultater av utførelsen. Hvis du trenger desimaltall og vil bruke vanlig avrunding, bruk WorksheetFunction.Round-funksjonen for å runde tallet før du bruker det i en For... Next-løkke.


Diverse (39)
Excel-feil og feil (3)

Hvordan få tilgang til en rekkevidde fra VBA

Jeg antar at jeg ikke skal lyve når jeg sier at alle som programmerer i VBA veldig ofte kommuniserer til arkceller i kodene sine. Tross alt er dette nesten hovedformålet med VBA i Excel. I prinsippet er det ikke noe komplisert med dette. For eksempel å skrive ordet i celle A1 Hei du må utføre koden:

Hvis du trenger å referere til et navngitt område:

Celler (1, 1) .Value = "(! LANG: Hei"!}

Områdeobjektsyntaks:
Område ( Celle 1, Celle 2)

  • Celle 1- den første cellen i området. Kan være en referanse til en celle eller et celleområde, en tekstlig representasjon av en adresse eller et område/cellenavn. Du kan angi urelaterte områder (A1, B10), kryss (A1 B10).
  • Celle 2- den siste cellen i området. Valgfritt å spesifisere. Referanser til en celle, kolonne eller rad er tillatt.

Syntaksen for Cells-objektet er:
Celler ( Rowindex, Kolonneindeks)

  • Rowindex- linjenummer
  • Kolonneindeks- kolonnenummer

Basert på dette er det lett å anta at området kan nås ved å bruke Cells and Range:

"velg området" A1: B10 "på det aktive arket Område (celler (1,1), celler (10,2)). Velg

og for hva? Tross alt kan det være mye kortere:

Område ("D5: F56"). Celler (3, 2) .Velg

Enig, dette er mye mer praktisk enn å telle hver gang. Spesielt hvis du må operere med en offset ikke med 2-3 celler, men med 20 eller mer. Offset kan selvsagt brukes. Men denne egenskapen forskyver området nøyaktig med det angitte antallet rader og kolonner, og du må redusere forskyvningen av hver parameter med 1 for å få ønsket celle. Og den forskyver hele området med det angitte antallet rader og kolonner, og ikke én celle. Dette er selvfølgelig heller ikke noe problem - du kan bruke Resize-metoden i tillegg til dette - men posten vil vise seg å være noe lengre og mindre beskrivende:

Dim rR som områdesett rR = område ("D5")

hvis du ikke bruker Set, får du i beste fall en feil, og i verste fall (det er mulig hvis du ikke tilordner en type til rR), vil variabelen bli tildelt Null eller standard celleverdi. Hvorfor er det verre? For i dette tilfellet vil koden fortsette å kjøre, men logikken til koden vil være feil, siden Denne variabelen vil inneholde en verdi av feil type, og bruken av den i koden i fremtiden vil fortsatt føre til en feil. Bare denne feilen vil være vanskeligere å fange.
I fremtiden kan du bruke en slik variabel på samme måte som en direkte referanse til området:

"Slik ser oppføringen av ordet Test ut i celle A1-område (" A1 "). Velg Selection.Value =" (! LANG: Test"!}

Men som regel er fremheving en unødvendig handling. Du kan skrive verdien uten:

La oss nå se nærmere på hvordan du får tilgang til et område uten å markere det og samtidig gjøre alt riktig. Område og celle er arkobjekter. Hvert objekt har en forelder – grovt sett er dette et annet objekt som styrer barnet. For en celle er det overordnede objektet et ark, for et ark - en bok, for en bok - et Excel-program. Hvis du ser på hierarkiet av objektavhengigheter, vil det se slik ut fra senior til junior:
Applikasjon => Arbeidsbøker => Ark => Område
Som standard, for alle områder og celler, er overordnet det gjeldende (aktive) arket. De. hvis du for et område (celle) ikke eksplisitt spesifiserer arket det tilhører, vil det gjeldende ActiveSheet bli brukt som dets overordnede ark:

"skriv ordet Test i celle A1 på det aktive arket Range (" A1 "). Verdi =" (! LANG: Test"!}

De. hvis Ark1 er aktivt, så ordet Test vil bli skrevet til celle A1 i Ark1. Hvis Ark3 er aktivt - i A1 Ark3. Med andre ord, en slik post tilsvarer posten:

"aktiver Sheet2 Worksheets (" Sheet2 "). Velg" skriv ordet Test i celle A1 Range ("A1"). Verdi = "(! LANG: Test"!}

For ikke å aktivere et annet ark for å skrive data til det, må du eksplisitt angi at Range-objektet tilhører dette arket:

"skriv ordet Test i celle A1 på Ark2 uavhengig av hvilket ark som er aktivt Regneark (" Ark2 "). Område (" A1 "). Verdi =" (! LANG: Test"!}

På samme måte leses data fra cellene - hvis du ikke spesifiserer arket hvis celledata skal leses, vil dataene fra cellen til det aktive arket bli lest. For å lese data fra Ark2 uavhengig av hvilket ark som er aktivt, brukes følgende kode:

"les verdien av celle A1 fra Ark2 uavhengig av hvilket ark som er aktivt MsgBox Worksheets (" Ark2 "). Område (" A1 "). Verdi

Fordi cellen er en del av et ark, så er arket en del av en bok. Basert på dette er det lett å konkludere med at med to eller flere bøker åpne, kan vi også referere til cellene i et hvilket som helst ark i en åpen bok uten å aktivere verken boken eller arket:

"skriv ordet Test i celle A1 på Ark2 i Bok2.xlsx uavhengig av hvilken bok og hvilket ark som er aktivt. Arbeidsbøker (" Bok2.xlsx "). Regneark (" Ark2 "). Område (" A1 "). Verdi =" ( ! LANG: Test" "считываем значение ячейки A1 с Лист2 книги Книга3.xlsx независимо от того, какой лист активен MsgBox Workbooks("Книга3.xlsx").Worksheets("Лист2").Range("A1").Value!}

Et viktig poeng: det er best å alltid inkludere boknavnet sammen med utvidelsen (.xlsx, xlsm, .xls, etc.). Hvis i Windows OS-innstillingene ( Kontrollpanel -Mappeinnstillinger-fane Utsikt -Skjul utvidelser for registrerte filtyper) er det spesifisert for å skjule utvidelser - da er det ikke nødvendig å spesifisere utvidelsen - Arbeidsbøker ("Book2"). Men det blir ingen feil hvis du spesifiserer det. Imidlertid, hvis elementet "Skjul utvidelser for registrerte filtyper" er deaktivert, vil spesifisering av arbeidsbøker ("Book2") sikkert føre til en feil.

Svært ofte gjør nybegynnere feil når de får tilgang til cellene i ark og bøker, spesielt i sykluser gjennom ark. Her er et eksempel på feil loop:

Dim wsSh som regneark for hver wsSh i ActiveWorkbook.Worksheets Range ("A1"). Verdi = wsSh.Name "skriv i celle A1 arknavnet MsgBox Range (" A1 "). Verdi" (! LANG: sjekk om navnet var skrevet Neste wsSh

MsgBox vil returnere de riktige verdiene, men selve arknavnene vil ikke bli skrevet til hvert ark, men sekvensielt inn i cellen til det aktive arket. Derfor vil det på det aktive arket i celle A1 være navnet på det siste arket.
Og slik ser den riktige sløyfen ut:
Alternativ 1 - bladaktivering (sakte)

Dim wsSh som arbeidsark for hver wsSh i ActiveWorkbook.Worksheets wsSh.Activate"активируем каждый лист Range("A1").Value = wsSh.Name "записываем в ячейку А1 имя листа MsgBox Range("A1").Value "sjekk om navnet er skrevet Neste wsSh

Alternativ 2 - uten å aktivere arket (raskere og mer korrekt)

Dim wsSh som regneark for hver wsSh i ActiveWorkbook.Worksheets wsSh.Range ("A1").Value = wsSh.Name "записываем в ячейку А1 имя листа MsgBox wsSh.Range("A1").Value "sjekk om navnet er skrevet Neste wsSh

Viktig: hvis koden er skrevet i arkmodulen (høyre museknapp på arket Kildetekst) og for Range- eller Cells-objektet er ikke overordnet spesifisert (det vil si at det ikke er noe ark- og boknavn) - da vil arket som koden er skrevet i bli brukt som overordnet, uavhengig av hvilket ark som er aktivt. Med andre ord, hvis du skriver en samtale som Range ("A1").Value = "Hei" , то слово привет всегда будет записывать в ячейку A1 именно того листа, в котором записан сам код. Это следует учитывать, когда располагаете свои коды внутри модулей листов.!}

I konstruksjoner som Område (celler (,), celler (,)) Range er en beholder der referanser til objekter er spesifisert, hvorfra en kobling til det direkte målobjektet vil bli opprettet.
Anta at ark1 er aktivt og koden kjøres fra sammendragsarket.
Hvis posten er av formen

Ark ("Totalt"). Område (celler (1, 1), Ark ("Totalt"). Celler (10, 1)) "oppføringen nedenfor er også feil Område (Celler (1, 1), Ark ("Totalt") " ) .Celler (10, 1))

Ark .Område (ark .celler (1, 1), ark .celler (10, 1)) område (ark .celler (1, 1), ark. celler (10, 1))

Ark. Område (ark. celler (1, 1), ark. celler (10, 1)) område (ark. celler (1, 1), ark. celler (10, 1))

Den andre posten inneholder ikke en referanse til overordnet for Range, men dette vil i de fleste tilfeller ikke forårsake feil - siden hvis koblingen ikke er spesifisert for beholderen, og for to objekter inne i beholderen, er overordnet den samme - den vil bli brukt på selve beholderen. Det er imidlertid bedre å gjøre som i første linje - dvs. med obligatorisk angivelse av overordnet for beholderen og for dens komponenter. Fordi Under visse omstendigheter (for eksempel hvis en arbeidsbok åpnet i Protected View er aktiv på tidspunktet for tilgang til området), kan tilgang til Range uten en forelder forårsake en kjøretidsfeil.
Hvis posten er av formen Område ("A1", "A10"), så er det ikke nødvendig å indikere koblingen til forelderen innenfor Range - det vil være nok å indikere denne koblingen før Range selv - Ark ("Totalt"). Område ("A1", "A10") siden den tekstlige representasjonen av adressen i området forplikter til å opprette en lenke spesifikt til forelderen til beholderen.

La oss se på et eksempel som er nær en livssituasjon. Det er nødvendig å legge inn subtraksjonsformelen på Total-arket, fra celle A2 og opp til den siste fullførte. På opptakstidspunktet er Ark1 aktivt. Svært ofte skriver nybegynnere slik:

Ark ("Totalt") .Rekkevidde ("A2: A" & Cells (Rows.Count, 1) .End (xlUp) .Row) _ .FormulaR1C1 = "= RC2-RC11"

Ark ("Total"). Område ("A2: A" & Cells (Rows.Count, 1) .End (xlUp) .Row) _ .FormulaR1C1 = "= RC2-RC11"

Blandet notasjon - både den tekstlige representasjonen av celleadressen ("A2: A") og objektreferansen Celler... I dette tilfellet vil ikke koden forårsake en eksplisitt feil, men den vil ikke alltid fungere slik vi ønsker. Og dette er det verste som kan skje under utvikling.
Ark ("Totalt"). Område ("A2: A"- Det opprettes en lenke til "A"-kolonnen på arket Utfall... Men neste gang kommer den første spalten. Og akkurat denne beregningen skjer på grunnlag av objektet Celler som ikke inneholder en referanse til det overordnede objektet. Dette betyr at den vil beregne den siste raden eksklusivt for gjeldende ark. (hvis koden er skrevet i en standardmodul, ikke en arkmodul)- dvs. for ark 1. Det ville vært riktig å skrive det slik:

lLastRow = Arbeidsbøker ("Book3.xls"). Ark ("Sheet1"). Celler (Rows.Count, 1) .End (xlUp) .Row

i utseende er alt bra, men det er en nyanse. Rows.Count vil som standard være den aktive arbeidsboken hvis den er skrevet i en standardmodul. Koden ovenfor skal fungere med arbeidsbok i formatet 97-2003 og beregne den siste fylte cellen på ark1. Excel 97-2003-arbeidsbøker (.xls) har totalt 65536 rader. Hvis en bok i 2007 og høyere format (formatene .xlsx, .xlsm, .xlsb, etc.) er aktiv på tidspunktet for utførelse av den gitte linjen, vil Rows.Count returnere 1048576 siden nøyaktig dette antallet linjer i ark med arbeidsbøker av versjoner av Excel, fra og med 2007. Og siden i boken der vi prøver å beregne den siste linjen, er det bare 65536 linjer - vi får feil 1004, fordi det kan ikke være noe linjenummer 1048576 på et ark med 65536 rader. Derfor er det fornuftig å spesifisere eksplisitt hvor du skal lese Rows.Count from:

Med arbeidsbøker ("Book3.xls"). Ark ("Sheet1") lLastRow = .Cells (.Rows.Count, 1) .End (xlUp) .Row End With

Det ville heller ikke skade å nevne muligheten for å tildele et ikke-sammenhengende område (ofte kalt "ragged"). Dette er et område som vanligvis brukes til å velge på et ark med Ctrl-tasten nede. Hva gjør den? Dette gjør det mulig å velge samtidig cellene A1 og B10 og skrive verdiene bare i dem. Det er flere måter å gjøre dette på. Den mest åpenbare og beskrevet i hjelpen er metoden Union:

Union (område ("A1"), område ("B10")). Verdi = "(! LANG: Hei" !}

Union (område ("A1"), område ("B10")). Verdi = "(! LANG: Hei"!}

Det er imidlertid en annen metode:

Område ("A1, B10") .Verdi = "(! LANG: Hei" !}

Område ("A1, B10"). Verdi = "(! LANG: Hei"!}

Hva er forskjellen (jeg vil til og med si en fordel) Union: kan brukes betinget i en loop. Velg for eksempel i området A1: F50 bare de cellene hvis verdi er større enn 10 og mindre enn 20:

Sub SelOne () Dim rCell As Range, rSel As Range For hver rCell In Range ("A1: F50") Hvis rCell.Value> 10 Og rCell.Value< 20 Then If rSel Is Nothing Then Set rSel = rCell Else Set rSel = Union(rSel, rCell) End If End If Next rCell If Not rSel Is Nothing Then rSel.Select End Sub

Sub SelOne () Dim rCell As Range, rSel As Range For hver rCell In Range ("A1: F50") Hvis rCell.Value> 10 Og rCell.Value< 20 Then If rSel Is Nothing Then Set rSel = rCell Else Set rSel = Union(rSel, rCell) End If End If Next rCell If Not rSel Is Nothing Then rSel.Select End Sub

Selvfølgelig kan du ganske enkelt overføre alle disse cellene til Range atskilt med kommaer, etter å ha dannet en streng tidligere. Men når det gjelder en streng, er det en begrensning: lengden på strengen må ikke overstige 255 tegn.

Jeg håper at etter å ha lest denne artikkelen, vil du ha mye mindre problemer med å få tilgang til områder og celler.

Se også:
[[Hvordan bestemmer jeg den siste cellen i et regneark via VBA?]]
[[Hvordan bestemmer jeg den første fylte cellen på et regneark?]]

Hjelpet artikkelen? Del lenken med vennene dine! Video leksjoner