2017-01-20 5 views
0

Я получаю еженедельный файл, в котором столбец должен быть разделен с использованием разделителя «,», но в котором позиция целевого столбца и длина значений в этом столбцы неизвестны и будут отличаться.Сохранять ведущие нули в Excel Split Output

Некоторые значения в целевом столбце для Split имеют ведущие 0, которые в настоящее время удаляются, как и ожидалось, если символы были введены в столбец, отформатированный как General. Целевой столбец для Split всегда форматируется как Text перед выполнением Split. Все значения из столбцов, отличных от целевого столбца, должны быть сохранены.

Целевая колонка, по-видимому, преобразуется в генератор вместо требуемого формата текста после выполнения приведенной ниже процедуры. Я не уверен, как обеспечить, чтобы столбец оставался Text и ведущие 0 сохраняются.

Текущий Суб:

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 

Примеры необработанных данных, выходной ток, и желанный выход связан ниже:

Examples

Любая помощь вы можете предоставить высоко оценили! Благодаря!

+2

вы можете попробовать сформировать ячейки как текст с '.NumberFormat =" @ "перед тем, как назначить свои значения. – Slai

+0

Также вы можете установить столбец как формат «Текст» – nightcrawler23

+0

Возможно, вы сможете использовать метод «Range.TextToColumns» и указать столбцы как «xlTextFormat» –

ответ

0

' можно использовать, чтобы заставить excel обрабатывать любое значение в виде текста.

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

После замены текущей строки x = Split это возвращает то же самое результат. Логически я бы подумал, что это не должно - как вы уже упоминали, предыдущий «» обычно заставлял значение распознаваться как текст, но в этом случае он не работал. – Bnecrons090

+0

это сработало для меня. Я написал небольшой фрагмент кода, в основном заимствованный у вас, и он сработал. – nightcrawler23

+0

@ Bnecrons090 Я забыл о первом значении. Если обновленная версия не работает, убедитесь, что '' 'не удаляются Transpose или какой-либо другой частью кода. – Slai

0

Если присвоить массив строк вместо массив Variant в диапазон, значения будут установлены как строки, даже если значения являются числовыми.

Что-то вроде этого должно работать.

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 
Смежные вопросы