2016-06-22 16 views
7

Tôi có một câu hỏi khác mà tôi hy vọng sẽ giải quyết với sự giúp đỡ của bạn.Mã VBA không xem qua các hàng ẩn để thêm hàng có số theo dõi

Tôi muốn làm gì. Tôi sử dụng Excel để theo dõi công việc, hoạt động, danh bạ, v.v. Trong khi làm điều đó tôi thấy tôi đã làm rất nhiều công việc lặp đi lặp lại trong việc thêm hàng ở cuối của một tờ gọi là "Hoạt động".

Điều tôi muốn làm là: - Nhấn nút và thêm hàng. - Tăng số theo dõi bằng 1 - Chèn giá trị mặc định

Mã. Để tự động này, tôi đã tìm thấy (sao chép, dán, điều chỉnh nó cho nhu cầu của tôi) đoạn mã sau:

Sub AddRowActiviteiten_NewAtEnd() 
'Add's a new row at the end of the sheet. 

Dim wsActiviteiten As Worksheet 
Set wsActiviteiten = Sheets("Activiteiten") 

DefType = "Daily" 
DefStatus = "Open" 
DefIssue = "*****" 
DefImpact = "*****" 
DefPrio = "Laag" 
MyDate = Date 

wsActiviteiten.Range("A4").Value = "1" 

'Copy the "One Row To Rule Them All" 
wsActiviteiten.Range("A3:Q3").Copy 

wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteAll) 

'Stop the "copy-action" 
Application.CutCopyMode = False 

'Increase the tracking number with "one" 
LastNumber = wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Value 
wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = LastNumber + 1 

'Insert default values 
LastRow = wsActiviteiten.Range("A" & Rows.Count).End(xlUp).Offset(-1, 0).Row 
Cells(LastRow + 1, 2) = DefType 
Cells(LastRow + 1, 3) = DefStatus 
Cells(LastRow + 1, 4) = DefIssue 
Cells(LastRow + 1, 5) = DefImpact 
Cells(LastRow + 1, 6) = DefPrio 
Cells(LastRow + 1, 8) = MyDate 

'Step down 1 row from present location. 
ActiveCell.Offset(1, 0).Select 

End Sub 

Vấn đề. Trong trang tính này, tôi mở các mục mới, nhưng tôi cũng đóng chúng lại. Tôi làm điều này bằng cách thay đổi trạng thái của họ và ẩn chúng khỏi chế độ xem. Và đây là điểm mà nó đi sai. Khi tôi đóng mục cuối cùng trên danh sách và muốn thêm hàng mới, macro thêm hàng mới bên dưới mục nhập lần hiển thị cuối cùng. Nó không tìm thấy mục nhập cuối cùng mà tôi vừa mới ẩn. Ngoài ra, khi điều này xảy ra, việc thêm các giá trị mặc định vào hàng mới sẽ không hoạt động. Nó thêm chúng ở hàng phía trên phần được thêm vào.

Bằng cách nào đó điều này có ý nghĩa hoàn hảo. Tôi nói với macro để tìm mục nhập cuối cùng, nhưng những gì tôi không hiểu là lý do tại sao nó nhìn vào mục nhập mới nhất có thể nhìn thấy và tại sao nó không nhìn vào hàng ẩn.

Để nhân rộng. Sao chép mã vào một trang tính (có thể bạn cần thay đổi tên của trang tính) và thêm một vài dòng. Đặt một số thông tin ở hàng cuối cùng và ẩn nó đi. Thêm một vài dòng khác và xem điều gì xảy ra.

Giải pháp. Có cách nào để giải quyết vấn đề này không? Có thể có cách làm thông minh hơn? Tôi nhìn vào mọi thứ, nhưng chủ yếu là tôi có kết quả bằng cách sử dụng "(" A "& Rows.Count) .End (xlUp)". Một vòng lặp có thể làm việc, nhưng tôi sợ rằng 1) Nó không tìm kiếm thông qua các hàng ẩn và 2) nó làm cho bảng (hơi) chậm chạp. Tôi phải nói rằng tôi đã cố gắng để làm cho một vòng lặp, đầu tiên tôi muốn xem nếu giải pháp đầu tiên của tôi là salvageable.

Cảm ơn bạn đã nhập liệu, nếu có bất kỳ câu hỏi nào, vui lòng cho tôi biết.

Simon EDIT: Mã làm việc cho bất cứ ai quan tâm đến

Sub AddRowActiviteiten_NewAtEnd() 
'Add's a new row at the end of the sheet. 

Dim wsActiviteiten As Worksheet 
Set wsActiviteiten = Sheets("Activiteiten") 

DefType = "Daily" 
DefStatus = "Open" 
DefIssue = "*****" 
DefImpact = "*****" 
DefPrio = "Laag" 
MyDate = Date 

'Copy the One Row To Rule Them All 
wsActiviteiten.Range("A3:Q3").Copy 

'Offset(y,x) 
'De -16 is een getal dat iets doet, maar ik weet niet wat. 
wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(1, -16).PasteSpecial (xlPasteAll) 

'Stop the "copy-action" 
Application.CutCopyMode = False 

'Het volgnummer verhogen met 1 
'Het laatste getal selecteren (LastNumber) en dan plus 1. 
LastNumber = wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(0, -16).Value 
wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(1, -16).Value = LastNumber + 1 

'Insert default values 
LastRow = wsActiviteiten.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Offset(-1, 0).Row 
Cells(LastRow + 1, 2) = DefType 
Cells(LastRow + 1, 3) = DefStatus 
Cells(LastRow + 1, 4) = DefIssue 
Cells(LastRow + 1, 5) = DefImpact 
Cells(LastRow + 1, 6) = DefPrio 
Cells(LastRow + 1, 8) = MyDate 

'Step down 1 row from present location. 
ActiveCell.Offset(1, 0).Select 

End Sub 
+4

Tôi sẽ sử dụng câu hỏi của bạn làm ví dụ về cách đặt câu hỏi. –

+1

Có lẽ [MSDN - SpecialCells] (https://msdn.microsoft.com/en-us/library/office/ff196157.aspx) có thể hữu ích. Đặc biệt 'xlCellTypeLastCell' – Skaterhaz

Trả lời

2

Cập nhật

tôi thấy tờ của bạn có AutoFilter "ẩn" các hàng status - mà Find sẽ không phát hiện, không giống như các hàng ẩn.

Đề nghị bạn thử mã cập nhật dưới đây:

Sub Test() 

Dim rng1 As Range 
If ActiveSheet.AutoFilterMode Then 
    MsgBox ActiveSheet.Range(Split(ActiveSheet.AutoFilter.Range.Address, ":")(1)).Row 
Else 
    Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious) 
    If Not rng1 Is Nothing Then MsgBox rng1.Row 
End If 
End Sub 

bài ban đầu

Nếu bạn đang ẩn hàng sau đó bạn có thể sử dụng Find với các tùy chọn xlFormulas để tìm các mục trong hàng ẩn (không giống như xlValues).

Dim rng1 As Range 
Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious) 
MsgBox rng1.Address 
+0

Tôi đang cố gắng sử dụng mã cụ thể này trong một mô-đun riêng biệt trên trang tính của mình. Khi tôi ẩn một hàng, macro này sẽ bật lên với vị trí của giá trị tiếp theo, nhưng không phải là giá trị ẩn. Khi đọc trên xlFormulas nó sẽ bật lên một giá trị từ một vị trí ẩn. Có điều gì tôi thiếu ở đây không? – Simon

+0

@simon là bạn có thể tải lên sổ làm việc mẫu (lên đám mây, v.v.) không? – brettdj

+0

Chắc chắn, ở đây bạn đi: we.tl/smyHLFDM49. Tôi đã thêm mã của bạn vào trang tính rồi. (đây là liên kết thứ hai, cái kia không tốt). – Simon

1

Giả sử chúng ta có một cột tình trạng AB và chúng tôi hiện đóng một mục bằng cách đặt chữ "Đóng cửa" trong cột đó và sau đó lẩn trốn hàng.

Thay vào đó:

  1. Unhide tất cả hàng
  2. Thực hiện bất kỳ chèn cần thiết và chỉnh sửa
  3. Qua một vòng lặp, ẩn tất cả các hàng được đánh dấu "Closed"
+1

Cảm ơn bạn đã bình luận cho Gary's Student. Tôi có thể thấy cách này có thể hoạt động trên trang tính của tôi. Nhưng tôi phải hỏi, để thực hiện những hành động này mỗi khi tôi thêm một hàng, điều này sẽ làm chậm tờ của tôi rất nhiều? – Simon

0

Sử dụng này để có được hàng cuối cùng và nó sẽ thấy hàng cuối cùng, ngay cả khi nó bị ẩn.

LastRow = wsActiviteiten.UsedRange.Rows.Count 
+0

Các UsedRange không nhất thiết phải bắt đầu trong hàng 1. Điều này là không đáng tin cậy. – brettdj

+0

Khi tôi thử nó với ví dụ mà OP gợi ý rằng chúng tôi sử dụng, nó hoạt động. Vì vậy, dựa trên đó ... nó có vẻ hoạt động tốt. o.O – Rodger

+0

Tôi hiểu điều này có thể không đáng tin cậy, nhưng trong macro cụ thể này, tại điểm cụ thể đó, tôi nghĩ rằng nó có thể hoạt động. Cảm ơn bạn đã trả lời Rodger của bạn. – Simon

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