【问题标题】:Selecting all data in other worksheet VBA选择其他工作表VBA中的所有数据
【发布时间】:2015-05-23 03:46:57
【问题描述】:

我是 VBA 新手,我正在尝试编写一些代码来选择获取与当前工作表不同的工作表中所有单元格的范围,将其打印在消息框中(用于测试目的),然后返回原单。我打算使用这个范围在新工作表中创建一个数据透视表,所以最后它需要采用“R1C1:R929C25”的形式为此,我使用了我在这里找到的代码:

How do you select the entire Excel sheet with Range using Macro in VBA?

这是我目前的代码:

Sheets("My_Sheet_Name").Cells.Select
MsgBox (Str(Range(Cells.Address)))
Sheets(Sheets.Count).Select

但是,这会返回错误:

运行时错误“1004”:
Range 类的 Select 方法失败。

编辑: 我已经获得了获取范围的代码,但是如何将其变成“R1C1:R929C25”的形式?

完成的工作代码:

Dim rng As Range
Set rng = Sheets("My_Sheet").UsedRange
Dim rc_range
rc_range = "R" & Trim(Str(rng.Rows.Count)) & "C" &       Trim(Str(rng.Columns.Count))
MsgBox (rc_range)

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"My_Sheet!R1C1:" & rc_range, Version:=xlPivotTableVersion10). _
CreatePivotTable TableDestination:=ActiveSheet.Name + "!R4C4",   

表名:=inputValue + "_PivotTable" _ , DefaultVersion:=xlPivotTableVersion10

【问题讨论】:

    标签: vba excel excel-2010


    【解决方案1】:

    你有两个选择。首先,您可以使用一个变量来存储您希望采取行动的范围。如果是一次性过程,则不需要变量,但如果是重复性任务,或涉及多个引用,请使用变量。

    选项二是直接引用另一个没有变量的范围。同样,如果它只是一次操作,例如显示一个消息框,请使用它。

    第一个例子:

    Set rng = Sheets("My_Sheet").Cells
    msgbox(rng.address)
    

    第二个例子:

    msgbox(Sheets("My_Sheet").Cells.Address)
    

    需要注意的是,Sheet.Cells 属性会返回适用工作表上的所有单元格。所以它总是$A$1:$XFD$1048576

    如果您只想要实际存储数据的单元格,请尝试使用UsedRange 属性,例如:

    Set rng = Sheets("My_Sheet").UsedRange
    msgbox(rng.address)
    

    【讨论】:

    • 您好,这有效!但是,由于我正在使用此范围制作数据透视表,如何将其更改为“R1C1:R929C25”形式?
    • 您不需要转换它,也不需要访问地址属性来将其加载到数据透视表中。而是直接引用变量:ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng, ...
    • 我如何为另一张工作表指定该范围?
    • 通过代码执行,正如我在原始回复中所讨论的那样:Dim rng as Range 然后,Set rng = Sheets("Data_Sheet").UsedRange 然后,对于枢轴:ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng, etc
    • 我的意思是如何使用 My_Sheet 中的范围在不同的工作表中创建数据透视表?
    【解决方案2】:

    根据 cmets 中的更新和更改,我包含了声明范围的完整代码集,并在 Pivot Table 中使用该范围以在新工作表中使用。请注意,我没有执行完整的错误检查,因此应该将其添加到代码中。例如,检查新的工作表名称是否已经存在,或者数据透视表名称是否已经存在,如果存在,则进行相应的处理。

    Sub CreatePivotFromDynamicRange()
        Dim wsNew As Worksheet
        Dim rngData As Range
        Dim rngDestination As Range
    
        'Add a new worksheet to store the pivot table
        '[NOTE] if sheet named "PivotSheet" already exists it will throw error
        Set wsNew = Worksheets.Add()
        wsNew.Name = "PivotSheet"
    
        'Define the range with the data needed for the pivot
        Set rngData = Sheets("My_Data").UsedRange
    
        'define the pivot destination
        Set rngDestination = wsNew.Range("A5")
    
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngData, _
            Version:=xlPivotTableVersion14).CreatePivotTable tabledestination:=rngDestination, _
            tablename:="NewPivot", defaultVersion:=xlPivotTableVersion14
    
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      您不能从您不活跃的工作表中选择单元格,但您可以引用它们。你想对“My_Sheet_Name"”中的单元格做什么

      如果您想要来自不同工作表的范围地址并且不知道最后一行或最后一列,那么您可以使用此代码。

      Sub SelectLastCellInInSheet()
          Dim sh As Worksheet
          Dim Rws As Long, Col As Integer, r As Range, fRng As Range
      
          Set sh = Sheets("My_Sheet_Name")
      
          With sh
              Set r = .Range("A1")
              Rws = .Cells.Find(what:="*", after:=r, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
              Col = .Cells.Find(what:="*", after:=r, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
              Set fRng = .Range(.Cells(1, 1), .Cells(Rws, Col))
          End With
      
          MsgBox fRng.Address
      End Sub
      

      【讨论】:

      • 我打算使用“My_Sheet_Name”中的单元格在不同的工作表中制作数据透视表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多