2017-01-20 3 views
0

Ich werde eine wöchentliche Datei erhalten, in der eine Spalte mit einem "," Trennzeichen geteilt werden muss, aber in der die Position der Zielspalte und die Länge der Werte in diesem steht Spalte sind unbekannt und werden variieren.Führende Nullen im Excel-Split beibehalten Ausgabe

Einige der Werte in der Zielspalte für den Split haben führende Nullen, die gerade entfernt werden, wie es zu erwarten wäre, wenn die Zeichen in eine als General formatierte Spalte eingegeben würden. Die Zielspalte für den Split wird vor dem Ausführen des Split immer als Text formatiert. Alle Werte aus anderen Spalten als der Zielspalte müssen beibehalten werden.

Die Zielspalte scheint nach dem Ausführen der folgenden Prozedur in das allgemeine Format anstelle des beabsichtigten Textformats konvertiert zu werden. Ich bin unsicher, wie man sicherstellen kann, dass die Spalte bleibt Text und die führenden Nullen bleiben erhalten.

Aktuelle Sub:

Examples

Jede mögliche Unterstützung Sie wird sehr geschätzt bieten kann:

Sub Test_Split_Column() 

Dim LR As Long, i As Long, LC As Integer 
Dim x As Variant 
Dim r As Range, iCol As Integer 
On Error Resume Next 
Set r = Application.InputBox("Click in the column to split by", Type:=8) 
On Error GoTo 0 
If r Is Nothing Then Exit Sub 
On Error Resume Next 
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Value = " " 
On Error GoTo 0 
iCol = r.Column 
Application.ScreenUpdating = False 
LC = Cells(1, Columns.Count).End(xlToLeft).Column 
LR = Cells(Rows.Count, iCol).End(xlUp).Row 
Columns(iCol).Insert 
For i = LR To 1 Step -1 
    With Cells(i, iCol + 1) 
     If InStr(.Value, ",") = 0 Then 
      .Offset(, -1).Value = .Value 
     Else 
      x = Split(.Value, ",") 
      .Offset(1).Resize(UBound(x)).EntireRow.Insert 
      .Offset(, -1).Resize(UBound(x) - LBound(x) + 1).Value = Application.Transpose(x) 
     End If 
    End With 
Next i 
Columns(iCol + 1).Delete 
LR = Cells(Rows.Count, iCol).End(xlUp).Row 
With Range(Cells(1, 1), Cells(LR, LC)) 
    On Error Resume Next 
    .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" 
    On Error GoTo 0 
    .Value = .Value 
End With 
With ActiveSheet.UsedRange 
    .Replace What:=" ", Replacement:=vbNullString, LookAt:=xlWhole 
End With 
Application.ScreenUpdating = True 

End Sub 

Beispiele für Rohdaten, Stromausgang und gewünschte Ausgabe unter unten stehendem Link! Vielen Dank!

+2

Sie können versuchen, die Zellen als Text mit '.NumberFormat =" @ "zu formatieren, bevor Sie ihre Werte zuweisen. – Slai

+0

Auch können Sie Ihre Spalte als "Text" -Format setzen – nightcrawler23

+0

Sie können möglicherweise die 'Range.TextToColumns' -Methode verwenden und die Spalten als 'xlTextFormat' angeben –

Antwort

0

' kann verwendet werden, um Excel zu zwingen, jeden Wert als Text zu behandeln.

x = Split(Replace("'" & .Value, ",", ",'"), ",") 
+0

Nach dem Ersetzen der aktuellen x = Split-Zeile gibt dies die gleiche zurück Ergebnis. Logischerweise würde ich denken, dass es nicht - wie Sie erwähnten, das vorhergehende "'" normalerweise zwingen würde, den Wert als Text zu erkennen, aber es schien in diesem Fall nicht zu funktionieren. – Bnecrons090

+0

hat es für mich funktioniert. Ich habe ein kleines Stück Code geschrieben, das im Prinzip von dir stammt, und es hat funktioniert. – nightcrawler23

+0

@ Bnecrons090 Ich habe den ersten Wert vergessen. Wenn die aktualisierte Version nicht funktioniert, stellen Sie sicher, dass die '' 'nicht durch Transpose oder einen anderen Teil des Codes entfernt werden. – Slai

0

Wenn Sie ein String-Array statt ein Variant-Array zu einem Bereich zuweisen, werden die Werte als Strings gesetzt werden, auch wenn die Werte numerisch sind.

So etwas sollte funktionieren.

Dim strValue As String 
    strValue = "000123,1234,0001" 

    Dim x As Variant 
    x = Split(strValue, ",") 

    ReDim result(0 To UBound(x), 0 To 0) As String 
    Dim i As Integer 
    For i = 0 To UBound(x) 
     result(i, 0) = x(i) 
    Next i 
    ActiveSheet.Range("A1:A3").Value = result