2010-10-11 36 views
5

Đây là mã mà tôi hiện đang làm việc cùng và tôi đang gặp sự cố này. Tôi là người mới ở Excel và tôi không thể tìm ra điều gì sai.Chọn phương pháp của lớp Phạm vi không thành công qua VBA

Private Sub cmdRecord_Click() 
Sheets("BxWsn Simulation").Range("Result").Select //This is the line with the problem, as excel told me. 
    Selection.Copy 
    Sheets("Reslt Record").Select 
    Sheets("Reslt Record").Range("A5000").End(xlUp).Offset(1).Select 
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ 
     xlNone, SkipBlanks:=False, Transpose:=False 
    Sheets("CuCon Simulator").Select 
    Application.CutCopyMode = False 
    Range("Improvement").Select 
End Sub 

Lỗi là phương pháp Chọn cấp độ không thành công qua VBA, Lỗi 1004. Bất kỳ ý tưởng nào?

Cảm ơn.

Edit:

Vì vậy, tôi chỉ cần thay đổi mã để

Sheets("BxWsn Simulation").Select 
Range("Result").Select 

Tôi tin rằng đây là những gì bạn có nghĩa là bằng cách làm cho nó hoạt động? Tuy nhiên, tôi vẫn nhận được 'Phạm vi' của đối tượng '_Worksheet' không thành công, lỗi 1004

+0

Tốt hơn là để lại nhận xét cho câu trả lời hơn là âm thầm chỉnh sửa câu hỏi; trong trường hợp thứ hai, tác giả của câu trả lời sẽ không nhận được bất kỳ thông báo nào về việc theo dõi của bạn. – GSerg

+0

Tôi đã cập nhật câu trả lời của mình. – GSerg

Trả lời

12

Tôi tin rằng bạn đang có the same problem tại đây.
Trang tính phải hoạt động trước khi bạn có thể chọn phạm vi trên đó.

Ngoài ra, không bỏ qua tên sheet vòng loại:

Sheets("BxWsn Simulation").Select 
Sheets("BxWsn Simulation").Range("Result").Select 

Hoặc,

With Sheets("BxWsn Simulation") 
    .Select 
    .Range("Result").Select 
End WIth 

mà là như nhau.

+0

Cảm ơn điều đó đã làm các trick. – guesthouse123

10

Câu trả lời đúng cho câu hỏi cụ thể này là "không chọn". Đôi khi bạn phải chọn hoặc kích hoạt, nhưng 99% thời gian bạn không. Nếu mã của bạn trông giống như

Select something 
Do something to the selection 
Select something else 
Do something to the selection 

Bạn có thể cần phải tái cấu trúc và cân nhắc không chọn.

Lỗi, phương pháp 'Phạm vi' của đối tượng '_Worksheet' không thành công, lỗi 1004 mà bạn nhận được là vì trang tính có nút trên đó không có dải ô có tên là "Kết quả". Hầu hết (có thể tất cả) các thuộc tính trả về một đối tượng có một đối tượng cha mẹ mặc định. Trong trường hợp này, bạn đang sử dụng thuộc tính Range để trả về một đối tượng Range. Vì bạn không đủ điều kiện thuộc tính Phạm vi, Excel sử dụng giá trị mặc định.

Đối tượng gốc mặc định có thể khác nhau tùy theo hoàn cảnh. Nếu mã của bạn nằm trong một mô-đun chuẩn, thì ActiveSheet sẽ là mặc định của cha mẹ và Excel sẽ cố gắng giải quyết ActiveSheet.Range ("Kết quả"). Mã của bạn nằm trong mô-đun lớp của trang tính (trang tính có nút trên đó). Khi tham chiếu không đủ tiêu chuẩn được sử dụng ở đó, cha mẹ mặc định là trang tính được gắn với mô-đun đó. Trong trường hợp này, chúng giống nhau vì trang tính phải hoạt động để nhấp vào nút, nhưng điều đó không phải lúc nào cũng đúng.

Khi Excel cung cấp lỗi bao gồm văn bản như '_Object' (của bạn nói '_Worksheet'), nó luôn đề cập đến đối tượng cha mẹ mặc định - dấu gạch dưới cho biết điều đó. Nói chung cách khắc phục đó là để đủ điều kiện tham chiếu bằng cách rõ ràng về cha mẹ. Nhưng trong trường hợp chọn và kích hoạt khi bạn không cần, tốt hơn là chỉ cần cấu trúc lại mã.

Đây là một cách để viết mã của bạn mà không cần chọn hoặc kích hoạt.

Private Sub cmdRecord_Click() 

    Dim shSource As Worksheet 
    Dim shDest As Worksheet 
    Dim rNext As Range 

    'Me refers to the sheet whose class module you're in 
    'Me.Parent refers to the workbook 
    Set shSource = Me.Parent.Worksheets("BxWsn Simulation") 
    Set shDest = Me.Parent.Worksheets("Reslt Record") 

    Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0) 

    shSource.Range("Result").Copy 
    rNext.PasteSpecial xlPasteFormulasAndNumberFormats 

    Application.CutCopyMode = False 

End Sub 

Khi tôi ở trong mô-đun lớp học, như mô-đun lớp của tờ bạn đang làm việc, tôi luôn cố gắng làm mọi thứ theo lớp đó. Vì vậy, tôi sử dụng Me.Parent thay vì ActiveWorkbook. Nó làm cho mã dễ dàng hơn và ngăn ngừa các sự cố không mong muốn khi mọi thứ thay đổi.

Tôi chắc chắn mã bạn hiện đang chạy bằng mili giây, vì vậy bạn có thể không quan tâm, nhưng tránh việc chọn chắc chắn sẽ tăng tốc mã của bạn và bạn không phải đặt ScreenUpdating. Điều đó có thể trở nên quan trọng khi mã của bạn phát triển hoặc trong một tình huống khác.

+0

+1 câu trả lời này xứng đáng được trả lời. –

+0

@Dick Kusleika, rất thông tin, cảm ơn. – jmaz

1

Điều này phù hợp với tôi.

RowCounter = Sheets(3).UsedRange.Rows.Count + 1 

Sheets(1).Rows(rowNum).EntireRow.Copy 
Sheets(3).Activate 
Sheets(3).Cells(RowCounter, 1).Select 
Sheets(3).Paste 
Sheets(1).Activate 
-1

Đây là cách bạn làm việc đó một cách dễ dàng và không phức tạp.
Thay vì sử dụng sheet(x).range sử dụng Activesheet.range("range").select

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