26.10.2015, 00:33
Hallo,
ich habe in einer Datei eine (lange) Liste von Zeilen.
Diese Zeilen sollen aufgesplittet werden, so daß jeder Begriff aus C einzeln in einer Zeile mit den restlichen Zellinhalten steht und in Spalte G jeweils eine 1. In C soll anschließend noch das führende Leerzeichen entfernt werden.
BOM
Mit diesem Makro wurde das gelöst, leider ist es aber (unendlich) langsam. Wie kann das schneller gemacht werden? Mit Array?
ich habe in einer Datei eine (lange) Liste von Zeilen.
Diese Zeilen sollen aufgesplittet werden, so daß jeder Begriff aus C einzeln in einer Zeile mit den restlichen Zellinhalten steht und in Spalte G jeweils eine 1. In C soll anschließend noch das führende Leerzeichen entfernt werden.
BOM
A | B | C | D | E | F | G | H | I | J | |
6 | Item # | Comment | Designator | Value | Voltage | Tolerance | Quantity | Footprint | Manufacturer | Manufacturer Part Number |
7 | 1 | Capacitor | C107, C108 | 470pF | 2 | Keramik RM75_d8 | Murata | DEBB33D471KA2B | ||
8 | 2 | Capacitor | C200, C201, C204, C205 | 2,2µF | 4 | C_RM27.5H24.5B14.0L31.5 | EPCOS | B32924C3225M | ||
9 | 3 | Capacitor | C202, C203 | 1,5µF | 2 | C_RM27.5H21.0B11.0L31.5 | EPCOS | B32924C3155M | ||
10 | 4 | Capacitor | C206, C207, C208, C209 | 47nF | 300V | 20% | 4 | C_RM15.0H14.0B8.5L18.0 | EPCOS | B32022A3473M |
11 | 5 | Capacitor | C349, C350, C351, C352 | 1nF | 4 | Keramik RM5_d8 | Murata | DEBB33D102KA2B | ||
12 | 6 | Capacitor | C353 | 4,7nF | 1 | Keramik RM10_d16 | Vishay | VY1472M63Y5UQ63V0 | ||
13 | 7 | Capacitor | C400, C405, C409, C416 | 1,5µF | 4 | C_RM27.5H28.0B18.0L31.0 | EPCOS | B32654A6155+000 | ||
14 | 8 | Capacitor | C401, C402, C407, C408, C414, C415 | 1,5nF | 6 | C_RM22.5H15.0B6.0L26.5 | Wima | FKP1U011505B00 | ||
15 | 9 | Capacitor | C500, C501, C507 | 100nF | 3 | C_RM27.5H24.0B13.0L31.5 | Wima | FKP1J031006D00 | ||
16 | 10 | Capacitor | C502, C504 | 22nF | 2 | C_RM27.5H26.0B15.0L31.5 | Wima | FKP1U022206F00 | ||
17 | 11 | Capacitor | C503, C505 | 15nF | 2 | C_RM27.5H24.0B13.0L31.5 | Wima | FKP1U021506D00 | ||
18 | 12 | Capacitor pol. | C700, C701 | 100µF | 2 | C Panasonic HD Series V Type G Size | Panasonic | EEEHD1V101AP | ||
19 | 13 | Capacitor SMD | C100, C101, C102, C103 | 10pF | 50V | 10% | 4 | C_sm_0603 | ||
20 | 14 | Capacitor SMD | C104, C105, C312, C313, C316, C318, C319, C327, C328, C331, C332, C340_A, C340_B, C344, C348, C600, C601, C604, C606, C608, C609, C610, C611, C612, C613, C614, C615, C616, C617, C618, C619, C621, C624, C625, C626, C627, C629, C702, C703, C704, C706 | 100nF | 50V | 10% | 41 | C_sm_0603 |
verwendete Formeln | |||
Zelle | Formel | Bereich | N/A |
A7:A20 | =ZEILE(A7) - ZEILE($A$6) |
Excel-Inn.de |
Hajo-Excel.de |
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007 |
Add-In-Version 19.07 einschl. 64 Bit |
Mit diesem Makro wurde das gelöst, leider ist es aber (unendlich) langsam. Wie kann das schneller gemacht werden? Mit Array?
Sub WerteTrennen()
loLetzte = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) 'letzte belegte Zeile in Spalte A (1)
For intZeile = loLetzte To 7 Step -1 'aktuelle Zeile
' If IsError(intBauteile = Range("G" & intZeile)) Then
If Not WorksheetFunction.IsNumber(Range("G" & intZeile)) Then
intBauteile = "1"
Else
intBauteile = Range("G" & intZeile) 'Anzahl Bauteile
End If
intEinfüg = intBauteile - 1 'Anzahl einzufügende Zeilen
If intEinfüg > 0 Then
'Zeilen einfuegen
Range("A" & intZeile + 1 & ":O" & intZeile + intEinfüg).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Zeilen runterkopieren
Range("A" & intZeile & ":o" & intZeile).Copy Range("A" & intZeile + 1 & ":o" & intZeile + intEinfüg)
'Zahl der Bauteile auf 1 setzen
Range("G" & intZeile & ":G" & intZeile + intEinfüg).Value = 1
'Werte aus C aufnehmen
arrWerte = Split(Range("C" & intZeile).Value, ",")
'Werte am Komma trennen und untereinander einfuegen
Range("C" & intZeile).Resize(Ubound(arrWerte) + 1) = WorksheetFunction.Transpose(arrWerte)
intZeile = intZeile + intEinfüg
End If
Next intZeile
'entfernen führender Leerzeichen
loLetzte = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) 'letzte belegte Zeile in Spalte A (1)
Range("C7:C" & loLetzte).TextToColumns Destination:=Range("C7"), DataType:=xlFixedWidth
'Zeilenhöhe anpassen
Rows("7:" & loLetzte).AutoFit
End SubVBA/HTML - CodeConverter für Office-Foren, AddIn für Excel/Word 2000-2013 - komplett in VBA geschrieben von Lukas Mosimann. Projektbetreuung durch mumpel
Code erstellt und getestet in Office 15