2010-04-16 43 views
12

Dường như Visual Basic không thể tham khảo trang tính theo tên trang tính đã sửa đổi của người dùng. Các tab bảng tính có thể có tên của họ thay đổi, nhưng có vẻ như Visual Basic vẫn nghĩ về tên trang tính là Sheet1, vv, mặc dù tab sổ làm việc đã được thay đổi thành một cái gì đó hữu ích.Tên bảng tính Excel so với tên bảng Visual Basic

Tôi có điều này:

TABname = rng.Worksheet.Name ' Excel sheet TAB name, not VSB Sheetx name. 

nhưng tôi muốn sử dụng tên sheet trong thói quen Visual Basic. Điều tốt nhất tôi có thể đưa ra cho đến nay là để Chọn trường hợp tab bảng tính so với tên Visual Basic, mà không làm cho ngày của tôi. Visual Basic phải biết tên Sheet1, Sheet2, v.v. Làm thế nào tôi có thể nhận được những liên kết với các tên tab Excel để tôi không phải duy trì một bảng tra cứu mà thay đổi với mỗi bảng mới hoặc bảng trang lại tên? Cảm ơn bạn đã trả lời trước.

+1

Tôi chưa bao giờ gặp phải tình huống mà tên trang tính bị thay đổi nhưng VB không thấy thay đổi. Bạn có thể hiển thị mã thích hợp của bạn không? –

Trả lời

16

Trong mô hình đối tượng Excel một Worksheet có 2 thuộc tính tên khác nhau:

Worksheet.Name
Worksheet.CodeName

thuộc tính Name là read/write và chứa tên xuất hiện trên tab trang tính. Đó là người dùng và VBA thay đổi

tài sản Codename là read-only

Bạn có thể tham khảo một tờ cụ thể như Worksheets ("Fred"). Range ("A1"), nơi Fred là tài sản .name hoặc là Sheet1.Range ("A1") trong đó Sheet1 là tên mã của trang tính.

+0

Vâng, đó là những gì tôi đang tìm kiếm, cảm ơn! – SteveNeedsSheetNames

+0

Bây giờ tôi muốn có một chức năng cơ bản trực quan với một đầu ra ParamArray, và tôi muốn đầu ra đó có sẵn cho một hàm khác, mà không cần phải đặt nó trên một trang tính chỉ để chọn nó vào hàm thứ hai đó. Có cách nào để chuyển mảng giữa các hàm trong hình ảnh cơ bản? Cảm ơn trước sự phản ứng của bạn. – SteveNeedsSheetNames

3

Bạn có thể tham khảo trang tính theo tên do người dùng cung cấp. Bạn có chắc là bạn đang tham khảo Bảng tính đúng không? Nếu bạn có nhiều hơn một sổ làm việc mở tại thời điểm bạn tham khảo một trang tính, điều đó chắc chắn có thể gây ra sự cố.

Nếu đây là sự cố, sử dụng ActiveWorkbook (sổ làm việc hiện đang hoạt động) hoặc ThisWorkbook (sổ làm việc chứa macro) sẽ giải quyết vấn đề.

Ví dụ,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet") 
0

Có (ít nhất) hai cách khác nhau để có được Worksheet đối tượng

  • qua Sheets hoặc Worksheets bộ sưu tập như tham chiếu bởi DanM
  • bởi không đủ tiêu chuẩn tên đối tượng

Khi một sổ làm việc mới với ba trang tính được tạo, sẽ tồn tại bốn đối tượng mà bạn có thể truy cập thông qua các tên không đủ tiêu chuẩn: ThisWorkbook; Sheet1; Sheet2; Sheet3. Điều này cho phép bạn viết những thứ như sau:

Sheet1.Range("A1").Value = "foo" 

Mặc dù điều này có vẻ như một lối tắt hữu ích, sự cố xảy ra khi bảng tính được đổi tên. Tên đối tượng không đủ tiêu chuẩn vẫn giữ nguyên là Sheet1 ngay cả khi trang tính được đổi tên thành một cái gì đó hoàn toàn khác.

Có một số logic để này vì:

  • tên bảng tính không phù hợp với các quy tắc tương tự như tên biến
  • bạn có thể vô tình che giấu một biến hiện

Ví dụ (thử nghiệm trong Excel 2003), tạo một Workbook mới với ba trang tính. Tạo hai mô-đun.Trong một mô-đun tuyên bố này:

Public Sheet4 As Integer 

trong các mô-đun đặt khác:

Sub main() 

Sheet4 = 4 

MsgBox Sheet4 

End Sub 

Run này và các hộp thông báo sẽ xuất hiện một cách chính xác.

Bây giờ, hãy thêm trang tính thứ tư vào sổ làm việc để tạo đối tượng Sheet4. Hãy thử chạy chính một lần nữa và lần này bạn sẽ nhận được một "đối tượng không hỗ trợ tài sản hoặc phương pháp" lỗi

0

Tôi đã phải nghỉ mát này, nhưng điều này có vấn đề với bảo trì.

Function sheet_match(rng As Range) As String ' Converts Excel TAB names to the required VSB Sheetx names. 
    TABname = rng.Worksheet.Name    ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates. 
' Next, match this Excel sheet TAB name to the VSB Sheetx name: 
    Select Case TABname 'sheet_match 
     Case Is = "Sheet1": sheet_match = "Sheet1" ' You supply these relationships 
     Case Is = "Sheet2": sheet_match = "Sheet2" 
     Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB 
     Case Is = "Sheet4": sheet_match = "Sheet4" 
     Case Is = "Sheet5": sheet_match = "Sheet5" 
     Case Is = "Sheet6": sheet_match = "Sheet6" 
     Case Is = "Sheet7": sheet_match = "Sheet7" 
     Case Is = "Sheet8": sheet_match = "Sheet8" 
    End Select 
End Function 
1

Thực tế, tên đối tượng/mã "Sheet1" có thể được thay đổi. Trong VBA, bấm vào Sheet1 trong danh sách đối tượng Excel. Trong cửa sổ thuộc tính, bạn có thể thay đổi Sheet1 để nói rng.

Sau đó, bạn có thể tham chiếu rng làm đối tượng chung mà không phải tạo biến trước tiên. Vì vậy, debug.print rng.name hoạt động tốt. Không còn tên bảng tính ("rng").

Không giống như tab, tên đối tượng có cùng hạn chế như các biến khác (ví dụ: không có khoảng trắng).

0

Sử dụng tên mã tấm được câu trả lời tôi cần quá để ngăn chặn một loạt các macro ngã - câu trả lời ccampj của trên gương this solution (với bức ảnh màn hình)

1

một giải pháp rất cơ bản này (có lẽ tôi là thiếu đầy đủ điểm của câu hỏi). ActiveSheet.Name sẽ trả về chuỗi của tên tab hiện tại (và sẽ phản ánh bất kỳ thay đổi nào trong tương lai của người dùng). Tôi chỉ cần gọi cho bảng hoạt động, thiết lập biến và sau đó sử dụng nó làm đối tượng của Worksheets. Ở đây tôi lấy dữ liệu từ một bảng để thiết lập một báo cáo cho một bộ phận. Macro này sẽ làm việc trên bất kỳ trang tính nào trong sổ làm việc của tôi được định dạng cho cùng một bộ lọc (tiêu chí và copytorange) - mỗi bộ phận sẽ có trang tính riêng và có thể thay đổi tiêu chí và cập nhật bằng macro đơn này.

Dim currRPT As String 
ActiveSheet.Select 
currRPT = (ActiveSheet.Name) 
Range("A6").Select 
Selection.RemoveSubtotal 
Selection.AutoFilter 
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _ 
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear 
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _ 
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 
+0

Vấn đề liệt kê Proc Cho phép thiết lập Nhận Func đã được với tôi trong một vài năm, nơi tên bảng tên bảng tên mã là một mớ hỗn độn .. Điều này sửa chữa đó. Nhiều đánh giá cao là mã của bạn Harry S –

3

này sẽ thay đổi tên tất cả các đối tượng bảng (từ quan điểm của trình soạn thảo VBA) để phù hợp với tên sheet của họ (từ quan điểm của Excel):

Sub ZZ_Reset_Sheet_CodeNames() 
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name) 

    Dim varItem As Variant 

    For Each varItem In ThisWorkbook.VBProject.VBComponents 
     'Type 100 is a worksheet 
     If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then 
      varItem.Name = varItem.Properties("Name").Value 
     End If 
    Next 
End Sub 

Điều quan trọng là lưu ý rằng tên đối tượng (tên mã) "(Tên)" đang bị ghi đè bởi tên thuộc tính "Tên", và vì vậy nó phải được tham chiếu như là một thuộc tính con.

+0

"Truy cập có lập trình cho dự án Visual Basic không đáng tin cậy" - bật cài đặt macro http://stackoverflow.com/a/25638419/ – user423430

+0

.Properties ("Name") .Giá trị chính xác những gì tôi đã tìm kiếm, cảm ơn! – baldmosher

+0

Vấn đề liệt kê Proc Cho phép thiết lập Nhận Func đã được với tôi trong một vài năm, nơi tên bảng tên bảng tên mã là một mớ hỗn độn .. Điều này sửa chữa đó. Nhiều đánh giá cao là mã của bạn Harry S –

Các vấn đề liên quan