การเลือกข้อมูลทั้งหมดในแผ่นงาน VBA อื่น

ฉันยังใหม่กับ VBA และฉันกำลังพยายามเขียนโค้ดที่เลือกรับช่วงของเซลล์ทั้งหมดในแผ่นงานอื่นที่ไม่ใช่แผ่นงานปัจจุบัน พิมพ์ในกล่องข้อความ (เพื่อการทดสอบ) และกลับสู่แผ่นงานต้นฉบับ . ฉันตั้งใจจะใช้ช่วงนี้เพื่อสร้างตารางสรุปข้อมูลในแผ่นงานใหม่ และสุดท้ายแล้วก็ต้องอยู่ในรูปแบบ "R1C1:R929C25" ในการดำเนินการนี้ ฉันใช้โค้ดที่พบที่นี่:

คุณจะเลือกอย่างไร แผ่นงาน Excel ทั้งหมดที่มี Range โดยใช้ Macro ใน VBA?

นี่คือรหัสที่ฉันมีจนถึงตอนนี้:

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

อย่างไรก็ตาม สิ่งนี้จะส่งคืนข้อผิดพลาด:

ข้อผิดพลาดรันไทม์ '1004':
เลือกวิธีการของคลาส Range ล้มเหลว

แก้ไข: ฉันได้รับรหัสเพื่อรับช่วงแล้ว แต่ฉันจะทำให้เป็นรูปแบบ "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


person Paradox    schedule 14.05.2015    source แหล่งที่มา


คำตอบ (3)


คุณมีสองทางเลือก ขั้นแรก คุณสามารถใช้ตัวแปรเพื่อจัดเก็บช่วงที่คุณต้องการดำเนินการได้ ถ้าเป็นขั้นตอนครั้งเดียว ก็ไม่จำเป็นต้องใช้ตัวแปร แต่ถ้าเป็นงานที่ต้องทำซ้ำๆ หรือเกี่ยวข้องกับการอ้างอิงหลายรายการ ให้ใช้ตัวแปร

ตัวเลือกที่สองคือการอ้างอิงถึงช่วงอื่นโดยตรงโดยไม่มีตัวแปร ขอย้ำอีกครั้ง หากเป็นการดำเนินการเพียงครั้งเดียว เช่น การแสดงกล่องข้อความ

ตัวอย่างแรก:

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)
person basodre    schedule 14.05.2015
comment
สวัสดี มันได้ผล! อย่างไรก็ตาม เนื่องจากฉันกำลังสร้างตารางสรุปข้อมูลในช่วงนี้ ฉันจะเปลี่ยนเป็นรูปแบบ R1C1:R929C25 ได้อย่างไร - person Paradox; 14.05.2015
comment
คุณไม่จำเป็นต้องแปลงข้อมูล และไม่จำเป็นต้องเข้าถึงคุณสมบัติที่อยู่เพื่อโหลดลงในตารางสรุปข้อมูล ให้อ้างอิงถึงตัวแปรโดยตรงแทน: ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng, ... - person basodre; 14.05.2015
comment
ฉันจะระบุช่วงนั้นสำหรับแผ่นงานอื่นได้อย่างไร - person Paradox; 14.05.2015
comment
ทำโดยใช้โค้ดตามที่กล่าวไว้ในการตอบกลับเดิมของฉัน: Dim rng as Range จากนั้น Set rng = Sheets("Data_Sheet").UsedRange จากนั้น สำหรับเดือย: ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng, etc - person basodre; 14.05.2015
comment
สิ่งที่ฉันหมายถึงคือฉันจะสร้างตารางสาระสำคัญในแผ่นงานอื่นโดยใช้ช่วงจาก My_Sheet ได้อย่างไร - person Paradox; 14.05.2015
comment
หากฉันป้อน rng โดยตรง ฉันจะได้รับข้อผิดพลาดประเภทไม่ตรงกัน - person Paradox; 14.05.2015
comment
@Paradox ฉันกำลังเพิ่มคำตอบใหม่เพราะเป็นการยากที่จะตอบในความคิดเห็น - person basodre; 14.05.2015

ตามการอัปเดตและการเปลี่ยนแปลงในความคิดเห็น ฉันได้รวมโค้ดชุดเต็มเพื่อประกาศช่วง และใช้ช่วงนั้นใน 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
person basodre    schedule 14.05.2015

คุณไม่สามารถเลือกเซลล์จากแผ่นงานที่คุณไม่ได้ใช้งานอยู่ แต่คุณสามารถอ้างอิงเซลล์เหล่านั้นได้ คุณต้องการทำอะไรกับเซลล์ใน "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
person Davesexcel    schedule 14.05.2015
comment
ฉันตั้งใจจะใช้เซลล์ใน My_Sheet_Name เพื่อสร้างตารางสรุปข้อมูลในแผ่นงานอื่น - person Paradox; 14.05.2015