Преобразование строк при чтении файла в VBA - PullRequest
1 голос
/ 10 апреля 2019

Я сейчас работаю с VBA, к которой я не привык. Я делаю сценарий, который читает некоторые данные из txt-файлов, а затем делает из них график. Скрипт читает txt-файлы, собирает данные и вводит их в рабочую книгу excel. Затем составляет графики этих значений. Предполагается, что одно значение умножается на коэффициент десять. Однако, читая значения и пытаясь преобразовать их в двойные, я сталкиваюсь с множеством проблем.

Вот как выглядит файл. И второй столбец - это то, что здесь интересно.

444.267 70.26   332.562 0.692   2   1   0   157.48
444.933 70.26   342.562 0.692   2   1   0   157.48
446.533 72.88   342.562 0.692   2   1   0   157.48
462.933 75.5    342.562 0.692   2   1   0   157.48
468.667 75.5    331.75  0.692   2   1   0   157.48
479.333 75.5    331.75  0.692   2   12  0   157.48
479.733 75.5    331.75  0.692   2   11  0   157.48
480.133 75.5    331.75  0.692   2   1   0   157.48
539.467 75.5    331.75  0.692   2   12  0   157.48

Ниже я приложил код. Я несколько изменил его для целей отладки.

For tmp1 = 1 To 70
        'While Not EOF(FileNum)
            Dim DataLine_Array() As String
            Line Input #FileNum, DataLine
            DataLine_Array = Split(DataLine, vbTab)

            Cells(i, 1) = DataLine_Array(0)
            Cells(i, 2) = DataLine_Array(1)
            Cells(i, 3) = DataLine_Array(2)
            Cells(i, 4) = DataLine_Array(3)
            Cells(i, 5) = DataLine_Array(4)
            Cells(i, 6) = DataLine_Array(5)
            Cells(i, 7) = DataLine_Array(6)
            Cells(i, 8) = DataLine_Array(7)
            On Error GoTo ErrLabel:
            Dim Tmp_Double As Double
            Tmp_Double = DataLine_Array(3)
            Cells(i, 10) = (Tmp_Double)

            'Here it goes wrong
            Cells(i, 9) = DataLine_Array(1) / 10
            Dim Test_test As String
            Dim test_test2 As Double
            Test_test = DataLine_Array(1) / 10
            test_test2 = DataLine_Array(1)

            'Output
            Debug.Print 'start'
            Debug.Print DataLine_Array(1)
            Debug.Print Test_test
            Debug.Print VarType(Test_test)
            Debug.Print test_test2
            Debug.Print VarType(test_test2)

ErrLabel:
            Resume Next
            i = i + 1
        Next tmp1

И это то, что выводится.

70.26
702,6
 8 
 7026 
 5 

72.88
728,8
 8 
 7288 
 5 

75.5
75,5
 8 
 755 
 5 

75.5
75,5
 8 
 755 
 5 

Как вы можете видеть, вывод выводится правильно, если просто печатать строку, вывод выводится правильно. Однако при сохранении в виде строки точка меняется на запятую и меняет место в зависимости от количества десятичных знаков. Я нахожусь в европейской стране, где в качестве десятичного разделителя вместо запятой используется запятая. Но это не должно влиять на мои мысли. При попытке сохранить значение как двойное, десятичные дроби полностью исчезают.

Цель - прочитать второй столбец файла как есть и умножить его на десять. Однако это сложно, если я не читаю значения единообразно.

Заранее спасибо!

1 Ответ

0 голосов
/ 10 апреля 2019

Mange_Man

Я бы предложил начать с того, чтобы взять данные вашего файла и поместить их в лист Excel.Если VBA не работает в Excel, он также не будет работать с файловым вводом / выводом.

Попробуйте вставить свой массив в Excel и запустите приведенный ниже макрос.

Если вашВ столбце «I» нет значений, умноженных на 10, поэтому я полагаю, что это проблема региональных настроек Excel (Европейский).

В противном случае это может быть связано с самим компьютером и его взаимодействием.с файловым вводом / выводом в Excel и европейскими региональными настройками.В любом случае попробуйте сначала в Excel как начало ..

Option Explicit

Sub Test()

Dim i As Integer
Dim n As Integer
Dim arr() As Double

Range("A1:A9").Select 'Select your nine rows

'Set delimiter if necessary
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1)), TrailingMinusNumbers:=True

i = 8
ReDim arr(i)

For n = 0 To i
    arr(n) = Range("B" & n + 1).value * 10 'Multiply values by 10
Next n

For n = 0 To i
    Range("I" & n + 1).value = arr(n) 'Set values in Column "I"
Next n

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...