Minulla on Excel-laskentataulukko, joka koostuu kahdesta sarakkeesta, joista toinen on täynnä merkkijonoja ja toinen tyhjä. Haluan käyttää VBA: ta määrittämään tyhjässä sarakkeessa olevien solujen arvon toisen sarakkeen viereisen merkkijonon arvon perusteella.
Dim regexAdmin As Object Set regexAdmin = CreateObject("VBScript.RegExp") regexAdmin.IgnoreCase = True regexAdmin.Pattern = "Admin" Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If regexAdmin.test(Cells(i, j).Value) Then Cells(i, j + 1).Value = "Exploitation" End If Next j Next i
Ongelma on, että kun tätä silmukkaa käytetään suurelle määrälle tietoja, se vie liian kauan, ja se kaatuu suurimmaksi osaksi Excelin.
Tietääkö kukaan parempaa tapaa tehdä tämä?
vastaus
Lyhyt vastaus on:
Älä käytä vba , käytä kaavaa. Erityisesti IF
ja HAKU .
=IF(SEARCH($A1,"Admin")>0,"Exploitation","")
Mutta tämä on koodin tarkistus, joten anna sen tehdä joka tapauksessa.
-
Regex on hidas. Näyttää siltä, että käytät sitä vain sen tapaustunnottomuuteen. Ottaen huomioon, että voit verrata solun arvoja suoraan käyttämällä
StrComp
vaihtoehtoavbTextCompare
. ( hyödyllinen artikkeli StrCompista ) -
i
jaj
käytetään tyypillisesti silmukkalaskureissa, muttarow
jacol
järkevämpi tässä tapauksessa.
Tältä voi näyttää:
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows Dim col As Integer For col = 1 To 2 If StrComp("Admin",Cells(row, col).Value,vbTextCompare) Then Cells(row, col + 1).Value = "Exploitation" End If Next col Next row
Vastaa
Luulisin, että yksinkertainen merkkijonojen vertailu olisi paljon nopeampaa kuin Regex.
Dim pattern as string pattern = "Admin" Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If Cells(i, j) = pattern Then Cells(i, j + 1) = "Exploitation" End If Next j Next i
Kommentit
- Tämä koodi ei ole ’ t osoitetapauksen epäherkkä vertailu, mutta ’ korjaat oikein. Regex on ylitaajuus ja merkkijonojen vertailu on suositeltavaa tässä tapauksessa. (Muuten tervetuloa Code Review -sovellukseen!)
Vastaus
Saanen ehdottaa 50%: n ajon lyhentämistä / vaivaa?
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows If StrComp("Admin",Cells(row, 1).Value,vbTextCompare) Then Cells(row, 2).Value = "Exploitation" End If Next row
Eikö kukaan huomannut, että OP puhuu ”YKSI sarakkeen tarkistamisesta kirjoittamalla vieressä olevaan SEURAAVAAN”? Miksi silmukoita sitten? Toinen välitys tarkista vain joko tyhjän solun tai yhden, jossa on ”Hyödyntäminen”.
Vastaa
Vau. Pelkkä parin ensimmäisen rivin lukeminen sai minut miettimään:
- Miksi myöhään sitova?
- Miksi käyttää regexiä lainkaan?
@ ckuhn203 on jo vastannut nimeämiseen vastauksessaan, mutta löydän tämän:
Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows
Muuttui:
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows
… Ei tarvitse kommenttia enää.
Haluan käyttää VBA: ta määrittämään tyhjässä sarakkeessa olevien solujen arvon toisen sarakkeen viereisen merkkijonon arvon perusteella.
Luulen, että ”[mis | ab] VBA: n avulla: Excel itse pystyy käsittelemään soluarvoja muiden tietojen perusteella solut ”arvot.
regexAdmin.Pattern = "Admin"
Luulen, että ”[mis | ab] käyttää regexiä: jos kuviosi on vain tavallinen sana, yrität todennäköisesti tappaa hyttynen bazookalla. Väärä työkalu t hän työskentelee täällä.
Vastaa
Aina kun käytät Range-objektia, se on tehtävä yhdellä luku- / kirjoitusoperaatiolla.
Ennen kuin syötät for-silmukan, sinun tulee lukea koko alue, jota haluat työskennellä.
data = Range(Cells(1,1), Cells(10,2)).Value
Nyt voit työskennellä tietojen kanssa:
For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If regexAdmin.test(data(i, j)) Then data(i, j + 1) = "Exploitation" End If Next j Next i
Kirjoita lopuksi tiedot takaisin Exceliin:
Range(Cells(1,1), Cells(10,2)).Value = data
Vastaa
B1: ssä:
=if(upper(A1)="ADMIN","Exploitation","")
Täytä sitten se. Tällöin kirjainkoko ei eroa.
Tämä automaattinen täyttö voidaan tehdä kahdella tavalla joko vuorovaikutteisesti laskentataulukossa tai ohjelmallisesti:
Vuorovaikutteisesti : Excelissä on automaattinen täyttöominaisuus. Kun B1 on valittu ja kaava on asetettu, kaksoisnapsauta täyttökahvaa, joka on pieni neliö solun oikeassa alakulmassa, kun se on valittu. Excel kopioi kaavan älykkäästi vierekkäisen alueen loppuun. Jos A1-A256: lla on tietoja ilman tyhjiä kohtia, se ”täyttää automaattisesti B256: een. Vaihtoehtoisesti, jos aihioita on, siirry alareunaan ja valitse B256 (tai mikä tahansa pää). Valitse sitten Ctrl + Vaihto + Ylänuoli ylöspäin alueelle B1 johtava alue ja Ctrl + D kopioi se alas (ajatella d = sama)
VBA: n käyttäminen … , jos sinun on tehtävä tämä ohjelmallisesti: valinnalla kaava, joka sisältää solun:
Selection.AutoFill Destination:=Range("B1:B19")
Automaattisella täytöllä on muita vaihtoehtoja muutamien hienojen temppujen tekemiseen.Voi kopioida kirjaimellisen arvon kaavan sijaan tai myös täyttää sarjan mallin perusteella. Voit myös asettaa mukautettuja malleja sen tunnistamiseksi, kuten toimialat, joita toistat tavallisesti tavaroissa, tai kaupungit, joissa olet vähittäiskaupan sijaintisi jne.
Kommentit
- Tervetuloa Code Review -sovellukseen! Kaipasin täysin, että OP: n ei tarvinnut ’ tarvita hakua sarakkeesta! ++ Paras ratkaisu täällä.
vastaus
Yhdistämällä kaikki muut vastaukset toisiinsa, kirjainkoko ei eronnut, kuten regex alkuperäisessä asiakirjassa, poisti tarpeen määrittää kuinka monta riviä ja kaikki muuttujat ilmoitetaan, koska Option Explicit
välttää niin monta virhettä vba
Option Explicit Sub checkForExploit() Dim row As Integer Dim data() As Variant Dim datarange As Range Set datarange = Range("A1:B10") data = datarange.Value For row = 1 To UBound(data, 1) If LCase(data(row, 1)) = "admin" Then data(row, 2) = "Exploitation" End If Next row datarange.Value = data End Sub