1

我想制作一个 VBSript,它将打开一个包含不同行和列的 csv,并从第 4 行第 1 列开始粘贴它们。到目前为止,我写的内容很慢,并且有很多列硬编码到其中。

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(wscript.Arguments(0))
objExcel.Visible = True
objExcel.Cells(1, 4).Value = wscript.Arguments(1)+" - "+wscript.Arguments(2)
objExcel.Cells(2, 4).Value = wscript.Arguments(3)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile (wscript.Arguments(4))
cCount = 1
rCount = 4

Do While objTextFile.AtEndOfStream <> True
        arrUserRecord = split(objTextFile.Readline, ",")
        Do While cCount<213
            objExcel.Cells(rCount, cCount).Value = arrUserRecord(cCount-1)
            cCount=cCount+1
        Loop
        cCount=1
        rCount=1+rCount
Loop
4

2 回答 2

4

Excel 可以相当特别地接受它作为“有效 CSV”的内容。我不得不多次求助于以下方法:

Const vbFormatStandard = 1
Const vbFormatText     = 2
Const vbFormatDate     = 4

Const xlDelimited      = 1
Const xlDoubleQuote    = 1

' change according to number/type of the fields in your CSV
dataTypes = Array( Array(1, vbFormatText) _
  , Array(2, vbFormatStandard) _
  , Array(3, vbFormatText) _
  , Array(4, vbFormatDate) _
  )

Set xl = CreateObject("Excel.Application")
xl.Visible = True

xl.Workbooks.OpenText "input.csv", , , xlDelimited, xlDoubleQuote, False _
  , False, True, , , , dataTypes
Set wb = xl.ActiveWorkbook
于 2012-10-19T08:15:43.207 回答
1

如果它是一个有效的 CSV 文件,那么 Excel 可以直接打开它。因此,只需编写您的 VBscript 来告诉 Excel 打开 CSV 文件,就好像它是一个工作簿一样。然后,您可以将该工作簿中所需的数据复制到您的工作簿中。


如果您不知道如何做到这一点,那么 VBA 是最好的方法,但您也应该能够在 VBscript 中模拟它。这是我认为它应该看起来的样子,尽管我无法确定:

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(wscript.Arguments(0))
objExcel.Visible = True
objExcel.Cells(1, 4).Value = wscript.Arguments(1) + " - " + wscript.Arguments(2)
objExcel.Cells(2, 4).Value = wscript.Arguments(3)

Set objWorksheet = objWorkbook.ActiveSheet

Set objWbkCsv = objExcel.Workbooks.Open(wscript.Arguments(4))
Set objWksCsv = objWbkCsv.Worksheets(1)
Set objRangeSource = objWksCsv.UsedRange

cCount = objRangeSource.Columns.Count
rCount = objRangeSource.Rows.Count + (4 - 1)
Set objRangeDest = objWorksheet.Range(objWorksheet.Cells(4, 1), objWorksheet.Cells(rCount, cCount))

objRangeSource.Copy objRangeDest
于 2012-10-18T19:13:33.830 回答