【问题标题】:CountA using data in the worksheet in order to reference external fileCountA 使用工作表中的数据来引用外部文件
【发布时间】:2020-09-29 03:55:21
【问题描述】:

我正在尝试让这段代码正常工作:

Sub GetExternalData()

    Dim wbPath As String, WorkbookName As String
    Dim WorksheetName As String, CellRef As String
    Dim Ret As String, i As Long, N As Long

    For i = 1 To Sheets("x").Cells(Rows.Count, 1).End(xlUp).Row

        wbPath = Sheets("x").Cells(i, 1).Value
        WorkbookName = Sheets("x").Cells(i, 2).Value
        WorksheetName = Sheets("x").Cells(i, 3).Value
        CellRef = Sheets("x").Cells(i, 4).Value

        Ret = Application.WorksheetFunction.CountA("'" & wbPath & "[" & WorkbookName & "]" & _
              WorksheetName & "'!" & Range("C:C").Select)

        Sheets("x").Cells(i, 5).Value = ExecuteExcel4Macro(Ret)
        
    Next i
End Sub

基本上,我在第 1 列中有一个文件夹路径,在第 2 列中有文件名,在第 3 列中有工作表名称。我想拿这些并在参考文件的C列中找到项目数。

目前,当列中有 30 个值时,方程仅输出值 1。想知道我调用COUNTA 函数的方式是否有问题,其结果后来在ExecuteExcel4Macro 中使用。最初它只是为了调用 ref 文件中的特定值(C2 处的值),它确实有效。

【问题讨论】:

  • 您混合了不同的概念:您不能将任何工作表函数传递给 ExecuteExcel4Macro 并让它评估该公式 - 它必须是有效的 XL4 宏函数。请参阅 - exceloffthegrid.com/download/4095 您可能需要打开每笔罚款才能进行计数。

标签: excel vba excel-4.0


【解决方案1】:

ExecuteExcel4Macro 可用于读取单个单元格,但您不能将 任何 函数传递给它:只有当它是有效的 Excel 4.0 宏函数时(参见 https://exceloffthegrid.com/download/4095/

通过打开工作簿最容易做到这一点:

Sub GetExternalData()

    Dim wbPath As String, WorkbookName As String
    Dim WorksheetName As String, CellRef As String
    Dim Ret as long, i As Long, N As Long

    With ThisWorkbook.Worksheets("x")
        For i = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
    
            wbPath = .Cells(i, 1).Value
            WorkbookName = .Cells(i, 2).Value
            WorksheetName = .Cells(i, 3).Value
            'CellRef = .Cells(i, 4).Value
            
            With Workbooks.Open(wbPath & "\" & WorkbookName).Worksheets(WorksheetName)
                Ret = Application.CountA(.Columns("C"))
                .Parent.Close False
            End With
            .Cells(i, 5).Value = Ret
    
        Next i
    End With
End Sub

【讨论】:

  • 谢谢蒂姆,这很有效,只是添加了 ActiveWorkbook 来关闭功能,否则我会收到错误消息。唯一的想法是是否会有一种有效的方法对大量文件执行此操作,即 1000、2000 ......我可以查看 python 解决方案,但 VBA+power 查询只需要很少的设置。
  • 我错过了.Close 上的那个问题 - 将您的编辑更改为.Parent,因为它更直接地与工作表对象相关联。是的,它不是很“有效”;您可以考虑使用 SQL 查询来计算值 - 我不知道这是否会更快,但性能通常相当不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2016-04-28
  • 1970-01-01
相关资源
最近更新 更多