2015-05-14 3 views
0

Я новичок в VBA, и я пытаюсь написать код, который выбирает, получает диапазон всех ячеек в другом листе, чем текущий, печатает его в окне сообщения (для тестирования) и возвращается к исходному листу. Я намерен использовать этот диапазон для создания сводной таблицы в новом листе, и поэтому в конце концов она должна иметь вид «R1C1:R929C25» Для того, чтобы сделать это, я использовал код, который я нашел здесь:Выбор всех данных на другом листе VBA

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 

Однако это возвращает ошибку:

Run-time error '1004':
Select method of Range class failed.

Edit: Я получил код для получения диапазона, но как это сделать в форме «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", 

TableName: = InputValue + "_PivotTable" _ , DefaultVersion: = xlPivotTableVersion10

ответ

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) 
+0

Привет, это сработало!Однако, поскольку я делаю сводную таблицу с этим диапазоном, как мне изменить ее на форму «R1C1: R929C25»? – Paradox

+0

Вам не нужно его преобразовывать, и вам не нужно получить доступ к свойству адреса, чтобы загрузить его в сводную таблицу. Вместо этого обратитесь к переменной напрямую: 'ActiveWorkbook.PivotCaches.Create (SourceType: = xlDatabase, SourceData: = rng, ...' – user3561813

+0

Как бы указать этот диапазон для другого листа? – Paradox

0

Вы не можете выбрать клетки из листа вы не активно но вы можете ссылаться на них. Что вы хотите сделать с клетками в "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 
+0

Я намерен использовать ячейки в «My_Sheet_Name», чтобы сделать сводную таблицу на другом листе. – Paradox

1

За обновлениями и изменениями комментариев я включаю полный набор кода для объявления диапазона и использую этот диапазон в 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 
Смежные вопросы