【问题标题】:Editing excel file using vbscript but the edits are taking too long to complete使用 vbscript 编辑 excel 文件,但编辑需要很长时间才能完成
【发布时间】:2017-07-06 05:13:59
【问题描述】:

/* 我使用 vb 脚本编辑 excel 文件的原因是:excel 文件会一直不同但格式相同,用户不想在他们的工作簿上保存 VBA 宏。

我从第 3 列获取值并将这些值添加到第 9 列的末尾。

*/

Set xlApp=CreateObject("Excel.Application")
Set xlBook=xlApp.Workbooks.Open("filepath", 0, true)
xlApp.visible=true


Set xlSheet=xlBook.Worksheets("Proposal Spreadsheet")
row=xlSheet.UsedRange.Rows.Count
col=xlSheet.UsedRange.Columns.Count

dim i 

For i=15 to xlSheet.UsedRange.Rows.Count 
cell=xlSheet.Cells(i,3).Value
celli=xlSheet.Cells(i,9).Value+"("+cell+")" //I am combining column 3 with column 9

xlSheet.Cells(i,9).Value=celli


Next

xlBook.Save
xlApp.Run "Submit_To_iDesk"
xlBook.Close

xlApp.Quit
Set xlApp=Nothing 
Set xlBook=Nothing 
WScript.Quit

【问题讨论】:

  • 您的代码实际上将第 9 列的值设置为第 9 列中的值 (celli=xlSheet.Cells(i,9).ValuexlSheet.Cells(i,9).Value=celli) - 这可能有点毫无意义(除非您将公式替换为一个值?)。
  • 你说的很对!我找不到将 column3 的值添加到 column9 的值而不替换它的方法。你有什么其他的建议?谢谢!
  • 可能使用xlSheet.Cells(i,9).Value=cell + celli 作为最后一行 - 以便将两个值相加。但下一个问题是……是第 9 列值的设置需要时间,还是(未发布的)Submit_To_iDesk 宏需要时间?
  • 这是第 9 列的值的设置需要时间,不会给它运行宏的机会。
  • 您是否希望将第 3 列中的值括在括号中?

标签: vba excel vbscript


【解决方案1】:

如果UsedRange 没有返回有用的数字,请使用一种更可靠的方法来查找列中最后使用的单元格:

Set xlApp=CreateObject("Excel.Application")
Set xlBook=xlApp.Workbooks.Open("filepath", 0, true)
xlApp.visible=true

Set xlSheet=xlBook.Worksheets("Proposal Spreadsheet")
row=xlSheet.Cells(xlSheet.Rows.Count, 9).End(-4162).Row ' -4162 is equivalent of "xlUp"

dim i 

For i=15 to row
    cell=xlSheet.Cells(i,3).Value
    celli=xlSheet.Cells(i,9).Value

    xlSheet.Cells(i,9).Value=celli & "(" & cell & ")"
Next

xlBook.Save
xlApp.Run "Submit_To_iDesk"
xlBook.Close

xlApp.Quit
Set xlApp=Nothing 
Set xlBook=Nothing 
WScript.Quit

【讨论】:

  • 它成功了!后来我发现实际上是我的笔记本电脑处理宏的时间更长。我在其他笔记本电脑上对其进行了测试,它的工作时间不到 30 秒。非常感谢您的帮助!
  • row=xlSheet.Cells(xlSheet.Rows.Count, 9).End(-4162).Row 。这部分效果很棒!再次,万分感谢!
【解决方案2】:

加快过程的关键是减少写操作的次数。
这是我的做法

  • 将范围变量(target)设置为第 9 列中的目标单元格
  • 从目标范围创建一个数组
  • 编辑 values 数组的元素 将 values 数组写回原来的数组
  • 1 次操作中的目标范围

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Users\best buy\Desktop\Book1.xlsx", 0, True)

xlApp.Visible = True
xlApp.ScreenUpdating = False
Set xlSheet = xlBook.Worksheets("Proposal Spreadsheet")

Dim i, values, LastRow, target

With xlSheet
    LastRow = xlSheet.UsedRange.Rows.Count
    Set target = .Range(.Cells(15, 9), .Cells(LastRow, 9))
    values = target.Value

    For i = LBound(values, 1) To UBound(values, 1)
        values(i, 1) = values(i, 1) & "(" & .Cells(i + 15 - LBound(values, 1), 3) & ")"
    Next
    target.Value = values
End With

xlBook.Save
'xlApp.Run "Submit_To_iDesk"
xlBook.Close
xlApp.ScreenUpdating = True
xlApp.Quit
Set xlApp = Nothing
Set xlBook = Nothing
WScript.Quit

【讨论】:

  • 我喜欢你干净的代码。我将对其进行测试,但现在它的某些语法看起来与 VBscript 不匹配,但非常感谢!
  • 我没有测试过,但我相信语法是正确的
  • 不知何故,代码在这一行不断出错>> Set target = .Range(.Cells(15, 9), .Cells(15, LastRow))。也许,范围定义不正确。如果您能更新我的信息,我将不胜感激。谢谢
  • @GereltuyaBatdemberel 重构了我的代码并对其进行了测试。让我知道它的表现。
  • @YowE3K 再次感谢。当我测试我的代码时,我应该使用更好的数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2018-02-07
  • 2016-07-30
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多