0

当前问题:

目标是将数据从源 .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
4

1 回答 1

3

我认为问题出在这一行:

for each oRow in usedRowsXP  
Introw = oRow

我不是很擅长VBA,但我认为usedRowsXP是一个范围,它的每一行也将是一个范围。因此 Introw 将是一个范围。尝试使用 oRow 的 Row 属性,它将返回其行号:

for each oRow in usedRowsXP  
Introw = oRow.Row 

之后,Introw 应该在 Cells(Introw, 1) 等表达式中正常工作。

于 2012-10-19T08:05:51.230 回答