2013-06-12 2 views
0

Я создал книгу Excel с макросом, предназначенным для экспорта всех данных из рабочего листа в файл .txt с фиксированной шириной.Как исправить проблему с интервалом при записи в .txt-файл?

У меня все работает отлично, за исключением одного. В поле XWGHT появляются пробелы после значений поля, когда они должны быть раньше. Ниже я приложил то, что я смотрю. Верхнее окно - это файл, содержащий реальные данные примера, ниже мои тестовые данные, записанные в .txt-файл.

Неуверенный, если дополнительная информация поможет, но мой рабочий лист, который экспортируется в тексте есть все поля, отформатированные как «Текст»

FileComparisons

Мой код:

'Export 
Sub Export() 

    'Clear out Export Worksheet 
    Worksheets("Export").Cells.ClearContents 

    ' Fill "Export" worksheet with the desired columns from "FeedSamples" in the order 
    ' listed in ImpfileFDF.pdf found in \\agfiles\public\Formflow 

    ' Use rowCnt to designate the range to copy to "Export" worksheet 
    Dim rowCnt As Long 
    rowCnt = Worksheets("FeedSamples").range("A1").CurrentRegion.Rows.Count 

    ' LABELRENO = XLABLER 
    Worksheets("Export").range("A1:A" & rowCnt).value = Worksheets("FeedSamples").range("A1:A" & rowCnt).value 
    ' XRPTNO = REPTNO 
    Worksheets("Export").range("B1:B" & rowCnt).value = Worksheets("FeedSamples").range("B1:B" & rowCnt).value 
    ' XPROD = B 
    Worksheets("Export").range("C1:C" & rowCnt).value = Worksheets("FeedSamples").range("C1:C" & rowCnt).value 
    ' XCLS1 = PRODNO1 
    Worksheets("Export").range("D1:D" & rowCnt).value = Worksheets("FeedSamples").range("E1:E" & rowCnt).value 
    ' XCLS2 = PRODNO2 
    Worksheets("Export").range("E1:E" & rowCnt).value = Worksheets("FeedSamples").range("F1:F" & rowCnt).value 
    ' XCLS3 = PRODNO3 
    Worksheets("Export").range("F1:F" & rowCnt).value = Worksheets("FeedSamples").range("G1:G" & rowCnt).value 
    ' DESC1 = XDSC1 
    Worksheets("Export").range("G1:G" & rowCnt).value = Worksheets("FeedSamples").range("H1:H" & rowCnt).value 
    ' DESC2 = XDSC2 
    Worksheets("Export").range("H1:H" & rowCnt).value = Worksheets("FeedSamples").range("I1:I" & rowCnt).value 
    ' DESC3 = XDSC3 
    Worksheets("Export").range("I1:I" & rowCnt).value = Worksheets("FeedSamples").range("J1:J" & rowCnt).value 
    ' DESC4 = XDSC4 
Worksheets("Export").range("J1:J" & rowCnt).value = Worksheets("FeedSamples").range("K1:K" & rowCnt).value 
    ' POSSNO = XPOSSR 
    Worksheets("Export").range("K1:K" & rowCnt).value = Worksheets("FeedSamples").range("L1:L" & rowCnt).value 
    ' DATEINSP = XDATE 
    Worksheets("Export").range("L1:L" & rowCnt).value = Worksheets("FeedSamples").range("M1:M" & rowCnt).value 
    ' SAMRECNO = XRCPT# 
    Worksheets("Export").range("M1:M" & rowCnt).value = Worksheets("FeedSamples").range("N1:N" & rowCnt).value 
    ' NOBAGS = XNOBAG 
    Worksheets("Export").range("N1:N" & rowCnt).value =  Worksheets("FeedSamples").range("O1:O" & rowCnt).value 
    ' NOGUAR = XNOGAR 
    Worksheets("Export").range("O1:O" & rowCnt).value = Worksheets("FeedSamples").range("P1:P" & rowCnt).value 
    ' ANALYSIS49 = X49 
    Worksheets("Export").range("P1:P" & rowCnt).value = Worksheets("FeedSamples").range("S1:S" & rowCnt).value 
    ' ANALYSIS50 = X50 
    Worksheets("Export").range("Q1:Q" & rowCnt).value = Worksheets("FeedSamples").range("T1:T" & rowCnt).value 
    ' BAGTAG = XMRKCD 
    Worksheets("Export").range("R1:R" & rowCnt).value = Worksheets("FeedSamples").range("U1:U" & rowCnt).value 
    ' ONHAND = XONHND 
    Worksheets("Export").range("S1:S" & rowCnt).value = Worksheets("FeedSamples").range("V1:V" & rowCnt).value 
    ' WTLBS = XWGHT 
    Worksheets("Export").range("T1:T" & rowCnt).value = Worksheets("FeedSamples").range("W1:W" & rowCnt).value 
    ' REMARKS = XCOMNT 
    Worksheets("Export").range("U1:U" & rowCnt).value = Worksheets("FeedSamples").range("AA1:AA" & rowCnt).value 
    ' MED = XMED 
    Worksheets("Export").range("V1:V" & rowCnt).value = Worksheets("FeedSamples").range("AK1:AK" & rowCnt).value 
    ' NONMED = XNOMED 
    Worksheets("Export").range("W1:W" & rowCnt).value = Worksheets("FeedSamples").range("AL1:AL" & rowCnt).value 
    ' GUARANL = XGANAL 
    Worksheets("Export").range("X1:X" & rowCnt).value = Worksheets("FeedSamples").range("BP1:BP" & rowCnt).value 
    ' GUARANMENT = XGMET 
    Worksheets("Export").range("Y1:Y" & rowCnt).value = Worksheets("FeedSamples").range("BQ1:BQ" & rowCnt).value 
    ' FLAGSAM = XFLAG 
    Worksheets("Export").range("Z1:Z" & rowCnt).value = Worksheets("FeedSamples").range("Q1:Q" & rowCnt).value 
    ' SAMDEF = XTYPE 
    Worksheets("Export").range("AA1:AA" & rowCnt).value = Worksheets("FeedSamples").range("R1:R" & rowCnt).value 
    ' TAKENOTHER = XTAKEN 
    Worksheets("Export").range("AB1:AB" & rowCnt).value = Worksheets("FeedSamples").range("AS1:AS" & rowCnt).value 
    ' METH1 = XMETHD 
    Worksheets("Export").range("AC1:AC" & rowCnt).value = Worksheets("FeedSamples").range("AT1:AT" & rowCnt).value 

    ' Need to format date fields from MM/DD/YYYY to MMDDYYYY for insertion to .txt file 
    Dim n As Integer 
    For n = 2 To rowCnt 
     Worksheets("Export").range("L" & n).value = Format(Worksheets("Export").range("L" & n).value, "mmddyyyy") 
    Next 

    Dim txtFile As String 
    txtFile = "\\filePATH\Personal Project Notes\IMPFILE.txt" 
    'Specify the widths of fields 
    'The number of columns is the number specified in the line below +1 
    Dim s(29) As Integer 
    s(0) = 6 
    s(1) = 6 
    s(2) = 4 
    s(3) = 1 
    s(4) = 2 
    s(5) = 1 
    s(6) = 1 
    s(7) = 1 
    s(8) = 1 
    s(9) = 1 
    s(10) = 6 
    s(11) = 8 
    s(12) = 6 
    s(13) = 2 
    s(14) = 2 
    s(15) = 1 
    s(16) = 1 
    s(17) = 40 
    s(18) = 12 
    s(19) = 6 
    s(20) = 79 
    s(21) = 1 
    s(22) = 1 
    s(23) = 2 
    s(24) = 2 
    s(25) = 1 
    s(26) = 1 
    s(27) = 17 
    s(28) = 18 

    'Write data to file 
    CreateFixedWidthFile txtFile, Worksheets("Export"), s 

End Sub 

Sub CreateFixedWidthFile(strFile As String, ws As Worksheet, s() As Integer) 
    Dim i As Long, j As Long 
    Dim strLine As String, strCell As String 

    'Get Freefile 
    Dim fNum As Long 
    fNum = FreeFile 

    ' Open Textfile 
    Open strFile For Output As fNum 

    ' Loop through all rows. i = 1 to include Headers in txt file, 2 to ignore Header row 
    For i = 2 To ws.range("a65536").End(xlUp).row 
     ' New Line 
     strLine = "" 
     ' Loop through each cell (field) in row 
     For j = 0 To UBound(s) 
      ' Write only to the length of the field 
      strCell = Left$(ws.Cells(i, j + 1).value, s(j)) 
      ' Add spaces to field value if value less than field length maximum 
     strLine = strLine & strCell & String$(s(j) - Len(strCell), Chr$(32)) 
     Next j 
     ' Write record to file 
     Print #fNum, strLine 
    Next i 
    ' Close file 
    Close #fNum 

End Sub 

EDIT :

SUCCESS!

Большое спасибо Тиму! Извините, что вчера ушел и не заметил комментария, который вы указали в коде.

ответ

1

EDIT (после того, как более внимательно читать вопрос)

For j = 0 To UBound(s) 
    tmp = ws.Cells(i, j + 1).value 
    pad = String(s(j),Chr(32)) 
    If j = 10 Then 'change number to required column 
     strLine = strLine & Right(pad & tmp, s(j)) 'pad on left 
    else 
     strLine = strLine & Left(tmp & pad, s(j)) 'pad on right 
    end if 
Next j 
+0

Спасибо за ответ Тим. Я попытался заменить мои 2 строки кода в моем цикле «j» с вашей строкой кода выше, но, к сожалению, все равно получаю тот же результат:/ –

+0

Вы уверены, что в ваших исходных данных еще нет прокладки? –

+0

Положительный. Все в книге хранится как «Текст», никаких других настроек форматирования или выравнивания. Мой код устанавливает ширину столбцов и добавляет в пробелы по мере необходимости, чтобы полностью заполнить фиксированную ширину столбца, когда значения не соответствуют максимальной длине. –

0

Из-за моментального снимка у меня создается впечатление, что это проблема выравнивания. В электронной таблице могут быть разные выравнивания для разных ячеек, и код, который вы написали, не заботится об этой проблеме. Попробуйте это после каждого пишущего строки:. Таблицах ("Экспорт") Диапазон ("" & rowCnt) .HorizontalAlignment = xlCenter

+0

Выравнивание Безразлично» t изменить свойство «Значение» ... –

+0

Спасибо за ответ Альваро. Я посмотрю на это больше и вернусь к вам. Я подозревал, что это может быть проблемой раньше и может подтвердить, что все ячейки на моем листе являются «Текст» без выравнивания вообще, кроме «Нижнее выравнивание». –

+0

Analytic Lunatic -> Добро пожаловать. Удачи. Tim Williams -> Не предназначен для изменения свойства value, он предназначен для изменения свойства выравнивания. Если он пишет предоставленную строку после каждой строки, изменяющей свойство value, результирующая ячейка будет иметь заданное выравнивание (а не значение по умолчанию). – varocarbas

Смежные вопросы