Van egy Excel munkalapom, amely két oszlopból áll, amelyek közül az egyik karakterláncokkal van kitöltve, a másik pedig üres. A VBA segítségével szeretném hozzárendelni az üres oszlop celláinak értékét a másik oszlop szomszédos karakterláncának értéke alapján.

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 

A A probléma az, hogy ha ezt a ciklust nagy adatmennyiségre használják, akkor a működése túl sokáig tart, és legtöbbször egyszerűen összeomlik az Excel.

Tud valaki jobb módszert erre?

Válasz

A rövid válasz:

Ne használja , használjon képletet. Különösen a IF és a KERESÉS .

=IF(SEARCH($A1,"Admin")>0,"Exploitation","") 

De ez a kód felülvizsgálata, úgyhogy ezt mindenképpen tegyük meg.

  • A regex lassú. Úgy tűnik, hogy “csak arra használod”. Tekintettel arra, hogy közvetlenül összehasonlíthatja a cellaértékeket a StrComp használatával a vbTextCompare opcióval. ( hasznos cikk az StrComp-ról )

  • i és j t általában hurokszámlálókhoz használják, de row és col van értelme ebben az esetben.

Így nézhet ki ez:

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 

Válasz

Azt gondolnám, hogy az egyszerű karakterlánc-összehasonlítás sokkal gyorsabb lenne, mint a 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 

Megjegyzések

  • Ez a kód nem ‘ t nem foglalkozik érzékeny összehasonlítással, de ‘ helyes. A regex overkill, és ebben az esetben a karakterlánc-összehasonlítást részesítik előnyben. (Egyébként üdvözöljük a Code Review-ban!)

Válasz

Javasolhatom a futásidő 50% -os csökkentését /erőfeszítés?

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 

Senki sem vette észre, hogy az OP valóban “EGY oszlop ellenőrzéséről, a szomszédos NEXT-hez való írásról” beszél? Miért hurok akkor oszlopokat? A második lépés csak egy üres cellát vagy egy “Exploitation” -et tartalmaz.

Válasz

Wow. Az első pár sor végigolvasása elgondolkodtatott:

  • Miért a késői kötés?
  • Miért használjon egyáltalán regexet?

@ ckuhn203 már válaszolta a névadást, de én ezt találom:

Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows 

Ebből kiderült:

Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows 

… Nincs szükség többé a megjegyzésre.


A VBA segítségével szeretném hozzárendelni az üres oszlop celláinak értékét a másik oszlop szomszédos karakterláncának értéke alapján.

Úgy gondolom, hogy “s [mis | ab] a VBA használatával: Maga az Excel is nagyon jó a cellák értékeinek más alapú hozzárendelésében cellák “értékek.


regexAdmin.Pattern = "Admin" 

Úgy gondolom, hogy “s [mis | ab] a regex használatával: ha a mintád csak egy egyszerű szó, akkor valószínűleg egy szúnyogot próbálsz megölni egy bazukával. Rossz eszköz a t itt dolgozik.

Válasz

Amikor belép a Range objektumba, egyetlen olvasási / írási művelettel kell végrehajtania.

A for ciklus megadása előtt olvassa el a teljes tartományt, amellyel dolgozni szeretne.

data = Range(Cells(1,1), Cells(10,2)).Value 

Most már dolgozhat az adatokkal:

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 

Végül írja vissza az adatokat az excelbe:

Range(Cells(1,1), Cells(10,2)).Value = data 

Válasz

B1-ben:

=if(upper(A1)="ADMIN","Exploitation","") 

Ezután egyszerűen töltse ki. Ez a kis- és nagybetűk közötti különbség.

Ez az automatikus kitöltés kétféle módon történhet, akár interaktív módon a munkalapon, akár programszerűen:

Interaktív módon : Az Excel rendelkezik automatikus kitöltési funkcióval. Ha a B1 van kiválasztva, és ezt a képletet beírja, kattintson duplán a kitöltő fogantyúra, amely a cella jobb alsó sarkában található apró négyzet, amikor kiválasztja. Az Excel intelligensen átmásolja a képletet a szomszédos tartomány végére. Ha az A1-A256 adatai üresek, akkor az automatikusan kitölti a B256-ot. Alternatív megoldásként, ha vannak üresek, görgessen az aljára, és válassza a B256 elemet (vagy bármi legyen is a vége). Ezután a Ctrl + Shift + Fel nyíl segítségével válassza ki a B1-re vezető tartományt, és a Ctrl + D a lemásoláshoz (gondolja meg, hogy d = ugyanaz)

A VBA használata … ha ezt programozottan kell elvégeznie: a képletet tartalmazó cellával kell kiválasztania:

Selection.AutoFill Destination:=Range("B1:B19") 

Az automatikus kitöltéshez további lehetőségek állnak rendelkezésre néhány jó trükk elvégzéséhez.Másolhat egy szó szerinti értéket képlet helyett, vagy kitölthet egy sorozatot egy minta alapján. Beállíthat egyéni mintákat is, amelyek felismerik, például az üzletágakat, amelyeket gyakran megismétel a dolgokban, vagy a városokban, ahol kiskereskedelmi telephelyei vannak stb.

Megjegyzések

  • Üdvözli a Code Review! Teljesen hiányzott, hogy az OP-nak nem kellett ‘ keresni az oszlopban! ++ A legjobb megoldás itt.

Válasz

Az összes többi választ összevonva a kis- és nagybetűket érzéketlenné tette, mint a regex az eredetiben, eltávolította a sorok megadásának és az összes változó deklarálásának szükségességét, mert Option Explicit elkerüli a vba ennyi hibáját

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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük