Несоответствие типов, сравните значение ячейки Excel со значением массива * ИСПРАВЛЕНО *

Текущая проблема:

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

Я собираю значения в массив из файла .csv в цикле, сравнивая одно из значений в массиве со значениями в целевом столбце листа Excel A, если совпадение произойдет, все значения в массиве должны быть скопированы в соответствующую строку на листе Excel.

Теперь я получаю сообщение об ошибке «Несоответствие типа» при попытке сравнить значения ячеек листа Excel со значением массива.

Вот соответствующие фрагменты кода:

sfile="\\DFSpath\file1.csv"
smaster="\\DFSpath\file2.xlsx"

set xlapp = createobject("excel.application")

set wbtarget = xlapp.workbooks.open(smaster)

set tgtworksheet = wbtarget.worksheets("sheet1")

set usedRowsXP = tgtworksheet.UsedRange.Rows

dim fs,objTextFile
set fs=CreateObject("Scripting.FileSystemObject")
dim arrStr
set objTextFile = fs.OpenTextFile(sfile)

Do while NOT objTextFile.AtEndOfStream
  arrStr = split(objTextFile.ReadLine,",")

    for each oRow in usedRowsXP   

    Introw = oRow
    If tgtworksheet.cells(Introw,1).value = arrStr(2) Then
    tgtworksheet.cells(Introw,4).value = arrStr(0)
    tgtworksheet.cells(Introw,5).value = arrStr(1)
    tgtworksheet.cells(Introw,6).value = arrStr(2)

    End If
    next
Loop

Исправлено изменением кода следующим образом:

dim fs,objTextFile
    set fs=CreateObject("Scripting.FileSystemObject")
    dim arrStr
    set objTextFile = fs.OpenTextFile(sfile)

'##Replace quotation marks with nothing in .csv##

strText = objtextFile.ReadAll
objTextFile.Close
strNewText = Replace(strText, """", "")

Set objtextFile = fs.OpenTextFile(sfile, 2)
objtextFile.Write strNewText
objtextFile.Close

set objTextFile = fs.OpenTextFile(sfile, 1)

'##Gather array out of line in .csv + compare user's name to name in excel sheet, if matches, copy data, repeat for each line##


Do while NOT objTextFile.AtEndOfStream
arrStr = split(objTextFile.ReadLine,",")     

for each oRow in usedRowsXP   

Introw = oRow.row
If Cstr(tgtworksheet.cells(Introw,1).value) = arrStr(2) Then
tgtworksheet.cells(Introw,4).value = arrStr(0)
tgtworksheet.cells(Introw,5).value = arrStr(1)
tgtworksheet.cells(Introw,6).value = arrStr(2)

End If
next

Loop

person Kristian Helenius    schedule 19.10.2012    source источник
comment
Какая именно ошибка и в какой строке? Если вы отлаживаете, проверили ли вы значения и типы переменных в этой строке? Например, если ваша ошибка находится в строке tgtworksheet.cells (Introw, 1) .value = arrStr (2), то какой тип - arrStr (2), а какой - tgtworksheet.cells (Introw, 1) .value ?? Если вы знаете, что значения будут числами, объявите свои переменные как таковые, если вы знаете, что вам нужны строки, объявите их как строки.   -  person Dan    schedule 19.10.2012
comment
Он не работает в строке: Если tgtworksheet.cells (Introw, 1) .value = arrStr (2) Then, Ошибка - Код несоответствия типа: 800A000D, ошибка времени выполнения. Я уже пробовал со значениями ячеек по value.ToString, но без кубиков, та же ошибка. Содержимое двух сравниваемых местоположений имеет одинаковый формат: ФАМИЛИЯ Имя. Значения ArrStr могут быть выведены эхом, но значения ячеек Excel не могут быть, вызывает ошибку несоответствия типа того же типа.   -  person Kristian Helenius    schedule 19.10.2012
comment
Я думаю, что ваша проблема - Introw - держу пари, что это объект строки, а не целое число. Если вы знаете номер первой строки, объявите Introw как это целое число и замените Introw = oRow на Introw = Introw + 1.   -  person Dan    schedule 19.10.2012
comment
Или еще у объекта строки есть дочерние ячейки? Может быть, вы можете заменить tgtworksheet.cells (Introw, 1) .value на oRow.cells (1, 1) .value или oRow.columns (1) .value или что-то в этом роде?   -  person Dan    schedule 19.10.2012
comment
Работал с oRow.row, теперь меня беспокоит только то, как исключить скобки из значения массива csv, чтобы значение можно было сопоставить со значением листа excel   -  person Kristian Helenius    schedule 19.10.2012
comment
Извините за мой английский, я имел в виду кавычки, а не скобки   -  person Kristian Helenius    schedule 19.10.2012


Ответы (1)


Думаю, проблема в этом ряду:

for each oRow in usedRowsXP  
Introw = oRow

Я не очень хорошо разбираюсь в VBA, но думаю, что usedRowsXP - это диапазон, и каждая его строка также будет диапазоном. Поэтому Introw будет диапазоном. Попробуйте использовать свойство Row для oRow, оно вернет номер своей строки:

for each oRow in usedRowsXP  
Introw = oRow.Row 

После этого Introw должен нормально работать в выражении Cells (Introw, 1) и т. Д.

person Imre Greilich    schedule 19.10.2012
comment
oRow.row работает, теперь проблема только в том, что значение массива - это ФАМИЛИЯ имя и значение ячейки ФАМИЛИЯ Имя, поэтому значение ячейки без скобок. Я уже пробовал использовать Cstr (...), но значение остается в том же формате - person Kristian Helenius; 19.10.2012
comment
Я заберу это обратно, оба значения - строки, скобки взяты из самого листа csv - person Kristian Helenius; 19.10.2012
comment
теперь меня беспокоит только то, как исключить скобки из значения массива csv, чтобы значение можно было сопоставить со значением листа Excel - person Kristian Helenius; 19.10.2012
comment
Синтаксис будет примерно таким: Replace(arrStr(2), """", "") Это заменит кавычки на пустую строку. Напишите это в строке, где вы соответствуете двум значениям, и, следовательно, оно будет соответствовать имени без кавычек. - person Imre Greilich; 19.10.2012
comment
Я надеялся попасть в разделение (objTextFile.ReadLine ,,), но он не принимает кавычки внутри кавычек. Таким образом, кавычки не будут скопированы ни в одно из значений массива. - person Kristian Helenius; 19.10.2012
comment
Попробуйте Split(Replace(objTextFile.ReadLine, """", ""),","). Сначала будут удалены кавычки, а оставшийся текст будет разделен на каждую запятую. В данном случае имеется в виду строка с таким содержанием:. Две двойные кавычки - это escape-символ для строки одинарных кавычек. - person Imre Greilich; 19.10.2012