【问题标题】:Pulling Information into new workbook from dynamic Worksheet Name从动态工作表名称中将信息拉入新工作簿
【发布时间】:2021-09-09 15:29:42
【问题描述】:

VBA 问题即将出现。

我有一个收入跟踪器(“revenue tracker.xlsx”)文件,我在其中创建了一个宏,用于过滤特定月份条目并根据月份条目创建一个新工作表(工作表标题为“一月”、“二月"等)

考虑到工作表名称是动态的,我现在想将这个新生成的工作表拉到一个新工作簿(“Cost Loader.xlsx”)中。

我的代码如下

Sub PullRevenueTrackerInfo()

'Pull info from respective column into correct column on to Cost Loader

Dim ws_mth As Workbook, ws_charges As Workbook, mapFromColumn As Variant, mapToColumn As Variant
    Dim lastCell As Integer, i As Integer, nextCell As Integer, arrCopy As Variant

Dim tbl As ListObject
Dim wsNames As Variant, ws As Worksheet, w As Worksheet, El As Variant, boolFound As Boolean


'2. Dynamic worksheets

wsNames = Split("January,February,March,April,May,June,July,August,September,October,November,December", ",")
    For Each w In Worksheets
        For Each El In wsNames
    If w.Name = El Then
        Set ws = w: boolFound = True: Exit For
    End If
    Next El
    Next w


'3. pull information

     Set ws_mth = Workbooks("Revenue Tracker.xlsx")
    Set ws_charges = Workbooks("Cost Loader.xlsx")
    
    mapFromColumn = Array("I", "J", "K", "L", "M", "N", "O", "P")  after
    mapToColumn = Array("A", "B", "C", "G", "K", "M", "H", "J") 

  For i = 0 To UBound(mapFromColumn)
  With ws_mth.Worksheets(ws.Name)   'run time 91 error - object variable not set
            lastCell = ws_mth.Sheets(ws.Name).ListObjects("Table_owssvr").Range.Rows.Count
            arrCopy = .Range(mapFromColumn(i) & 2 & ":" & mapFromColumn(i) & lastCell)
        End With

            With ws_charges.Worksheets(1)
                nextCell = .Range(mapToColumn(i) & .Rows.Count).End(xlUp).Row + 1
                .Range(mapToColumn(i) & nextCell).Resize(UBound(arrCopy), UBound(arrCopy, 2)).Value = arrCopy
            End With
            Next i

我在尝试从我有数据的特定列进行映射时出现类型不匹配错误。我尝试了几种不同的方法,目前非常令人沮丧,我似乎无法让它工作。提前致谢!

编辑:出现运行时错误`使用 ws_mth.Worksheets(ws.Name),我不确定如何调用正确的工作表

【问题讨论】:

  • Worksheets(w) 需要括号中的整数或字符串,即工作表索引号或字符串名称。所以,使用Worksheets(w.Name)
  • 修改了您的建议,不幸的是我现在收到错误“未设置对象变量”
  • 抱歉,读得太快了。您想将 ws 用于找到的工作表吗?那么应该是Worksheets(ws.Name)
  • 是的,恐怕这次尝试仍然没有太多的爱,尝试一些新事物,如果我可以开始工作,会回来报告
  • 您测试过ws 变量吗?你知道前面的循环是否真的找到了匹配项吗? Exit For 将退出内部循环:这是您想要的吗?您正在设置 boolFound(尽管它尚未初始化为 False):您打算在某处使用它吗?

标签: excel vba


【解决方案1】:

我已经对您的代码进行了一些修改、编辑、评论,我认为您的问题已经解决了:

Sub PullRevenueTrackerInfo()

'Pull info from respective column into correct column on to Cost Loader
    
    'Try to "group" variables like so, it helps you and others to catch-up while debugging
    Dim wb_mth, wb_charges As Workbook
    Dim mapFromColumn, mapToColumn As Variant
    Dim lastCell, i, nextCell As Integer
    Dim arrCopy, wsNames As Variant

    Dim tbl As ListObject
    Dim ws, w As Worksheet
    Dim El As Variant
    Dim boolFound As Boolean

    'Pay attention to variable naming!
    'You named those as "ws_mth" and "ws_charges"
    'which indicates you want Worksheets, but you want Workbooks
    Set wb_mth = Workbooks("Revenue Tracker.xlsx")
    Set wb_charges = Workbooks("Cost Loader.xlsx")

'2. Dynamic worksheets

wsNames = Split("January,February,March,April,May,June,July,August,September,October,November,December", ",")
    
    For Each w In wb_mth.Worksheets
        For Each El In wsNames
            If w.Name = El Then
                'Again, pay attention. You shall specify in which workbook your "ws" is
                Set ws = w: boolFound = True: Exit For
            End If
        Next El
        If boolFound Then Exit For 'Add this to exit second loop
    Next w


'3. pull information
    
    mapFromColumn = Array("I", "J", "K", "L", "M", "N", "O", "P")
    mapToColumn = Array("A", "B", "C", "G", "K", "M", "H", "J")

    For i = 0 To UBound(mapFromColumn)
        'Main problem. You tried to reference to worksheet by name,
        'while your target worksheet, as an object is already set (ws), so you can do:
        
        'With ws_mth.Worksheets(ws.Name)   'run time 91 error - object variable not set
        With ws
            lastCell = .ListObjects("Table_owssvr").Range.Rows.Count
            arrCopy = .Range(mapFromColumn(i) & 2 & ":" & mapFromColumn(i) & lastCell)
        End With

        With wb_charges.Worksheets(1)
            nextCell = .Range(mapToColumn(i) & .Rows.Count).End(xlUp).Row + 1
            .Range(mapToColumn(i) & nextCell).Resize(UBound(arrCopy), UBound(arrCopy, 2)).Value = arrCopy
        End With
    Next i

End Sub

我假设你期望这样的输出(这里我运行了两次宏):

如果它适合你,请告诉我:)

【讨论】:

  • 非常感谢,并为冗长的回复道歉!期间我一直在度假。真的很感激
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多