【问题标题】:how to define a range object in VBscript如何在VBscript中定义范围对象
【发布时间】:2019-10-16 03:38:29
【问题描述】:

我正在尝试将 VBA 程序转换为 VbScript 以便从 cmd 运行它。 我在 VBA 中创建了一个程序,它获取一个 Excel 工作簿和未标记单元格,同时将其内容保留在所有新形成的未标记单元格中。 解释: 秃头的零在一个合并的单元格中,一个在非合并的单元格中

[[0][0]][0][0]][1][1][1]

在函数之后,我希望结果如下所示:

[0][0][0][0][1][1][1]

一个单元格中的每个值

我写了一个 VBA 脚本来做这件事

此函数取一张纸并取消所有单元格的标记,同时保留所有新形成的单元格的值

Sub UnMergeFill(ByVal ws As Worksheet)

    Dim cell As Range, joinedCells As Range

    For Each cell In ws.UsedRange
        If cell.MergeCells Then
            Set joinedCells = cell.MergeArea
            cell.MergeCells = False
            joinedCells.Value = cell.Value
        End If
    Next

End Sub

此函数采用第一个函数并将其应用于工作簿中的所有工作表

sub UnMergeFillAllSheets()
    Dim ws As Worksheet
    for Each ws In Worksheets
         UnMergeFill ws
    Next
End Sub

当我将它转换为 VBScript 时,它看起来像:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Dim myworkbook, worksheetcount,cell
Set myworkbook = objExcel.Workbooks.Open("C:\Users\sm\Documents\work\try\try.xlsx")
worksheetcount = myworkbook.Worksheets.Count
Msgbox ("there are:"&worksheetcount&" sheets")'testing
set cell = CreateObject("Range")
For i= 1 To worksheetcount
    set ws = objExcel.Worksheets(i)
    ws.Activate
    for each cell in ws.UsedRange

    **take all merge cells and un-merge them**

    Next

Next

我的问题是我需要引用一系列合并的单元格, 当我尝试创建范围对象时出现错误:

activeX 组件无法创建对象:'Range'

我知道 Range 存在,因为我使用了 TypeName(ws.UsedRange) 并且对象是范围类型。

感谢您的帮助

【问题讨论】:

  • Set objExcel = CreateObject("Excel.Application") 应该是您对CreateObject() 的唯一用途。除此之外,让 Excel 对象模型创建必要的对象。
  • for each cell in ws.UsedRange 根本不需要 cell 成为先前定义的对象。该循环将遍历该范围。您应该简单地删除您尝试将cell 定义为Range 对象的行。

标签: excel vbscript


【解决方案1】:

您正在使用后期绑定。正确的形式是 Dim cell,并将其设置为 Range 对象。如果您尝试使用它执行 Range 对象无法执行的操作,您将不会获得任何调试帮助,就像您不会获得 IntelliSense 一样。

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

Dim myworkbook, worksheetcount, cell

Set myworkbook = objExcel.Workbooks.Open("C:\Users\sm\Documents\work\try\try.xlsx")
worksheetcount = myworkbook.Worksheets.Count

Msgbox ("there are:"&worksheetcount&" sheets")'testing

For Each ws In objExcel.Worksheets
    ws.Activate
    For each cell in ws.UsedRange.Cells 'Loop through Cells, not Rows or Columns

        **take all merge cells and un-merge them**
    Next cell
Next ws

【讨论】:

  • Dim myworkbook AS Object 在 VBScript 中没有意义
  • @JohnColeman 已修改。我通常使用 VBA 或 VB.Net,而不是 VBScript,所以不能总是记住其中的特定怪癖
  • As 根本不是关键字。在 VBScript 中,所有变量都是隐式变量。在您编辑的代码中使用As Long 也不起作用(也不需要)。
猜你喜欢
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多