Hỏi về cách tham chiếu, lựa chọn (select) đến một ô có thuộc tính đặc biệt (1 người xem)

Người dùng đang xem chủ đề này

votinh3290

Thành viên mới
Tham gia
1/4/12
Bài viết
8
Được thích
2
Nghề nghiệp
Vô công rồi nghề
Em cũng mới tìm hiều về VBA, gần đây sếp có giao cho em một file excel, trong đó có nhiều ô có nội dung lặp đi lặp lại nhiều lần và sếp yêu cầu là dưới mỗi ô đó thì chèn thêm một dòng, và địng dạng boder, tô màu cho dòng mới chèn đó. Sau khi tìm hiểu, sử dụng bộ thu macro và đọc thêm một số tài liệu thì em tạo được một đoạn mã đủ để thực hiện yêu cầu của sếp. đoạn mã như sau:

Sub insert()
For j = 1 To 3
For i = 1 To 50
If (Selection.Value = Range("c21").Value) Then
Selection.Select
Else
Selection.Offset(1).Select
End If
If ActiveCell.Value = "" And ActiveCell.Offset(1, 0).Value = "" And ActiveCell.Offset(2, 0).Value = "" Then Exit Sub
Next
Selection.Offset(1).Select
'chon dong chua o
Range(Selection, Rows(ActiveCell.Row)).Select
'boder
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
End With
'chen dong xuong
Selection.insert Shift:=xlDown
'boi mau dong
With Selection.Interior
.TintAndShade = -0.149998474074526
End With
'boder
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
End With
ActiveCell.Offset(1, 2).Select
Next
End Sub

Với đoạn code trên thì em đã đủ thực hiện yêu cầu của sếp. Thật may mắn là ô có nội dung được lặp lại đó (cần dò tìm) lại nằm trên một cột nên em mới có thể sử dụng được đoạn mã trên. với chỉ một lần click chuột.

Đoạn code trên của em còn rất nhiều sơ hở nên mang đến đây hỏi các anh chị trong diễn đàn vài vấn đề như sau:
- Trong đoạn mã trên thì em chỉ có thể tham chiếu được đến ô có nội dung là "*Đơn giá dự thầu" trên cùng một cột". Vậy nếu nó không nằm trên cùng một cột thì có cách nào để tham chiếu đến nó không ạ?
- dòng lệnh: If ActiveCell.Value = "" And ActiveCell.Offset(1, 0).Value = "" And ActiveCell.Offset(2, 0).Value = "" Then Exit Sub có nghĩa là nếu trong cột có 3 ô liên tiếp là trống thì sẽ thoát khỏi sub. Em dùng lệnh này để thoát khỏi sub vì trong cột không có 3 ô liên tiếp trống. Nếu như trong cột đó chẳng may có 3 ô liên tiếp trống thật mà ở dưới còn dữ liệu thì sẽ thoát mất. Cho e hỏi có cách nào để khắc phục điều này không ạ?
- Trong câu lệnh for i=1 to 50 của em thì chỉ tham chiếu được 50 lần, nghĩa là nếu khoảng cách giữa 2 ô có nội dung "Đơn giá dự thầu" lớn hơn 50 hàng thì không thể tham chiếu được tiếp. Có có cách nào để tham chiếu được đến ô "Đơn giá dự thầu" kế tiếp gần nhất, và khi tham chiếu được thì dừng lại không ạ? Tương tự với dòng for j=1 to 120
- Tương tự em cũng muốn hỏi câu lệnh nào có thể tham chiếu tới một ô có thuộc tính đặc biệt như là ô có giá trị cho trước, ô được tô màu sẵn, ô có định dạng là text (custom)... Và cách để tham chiếu đến ô gần nhất (xa nhất, hoặc ở vị trí xác định) so với ô đang được lựa chọn.

File đính kèm của em ở bên dưới. Do đây là file nội bộ nên em đã xóa bớt nội dung, các anh chị thông cảm cho em ạ!
 

File đính kèm

Lần chỉnh sửa cuối:
Sẽ cố trả lời cho bạn từng vấn đề 1:

- Trong đoạn mã trên thì em chỉ có thể tham chiếu được đến ô có nội dung là "*Đơn giá dự thầu" trên cùng một cột". Vậy nếu nó không nằm trên cùng một cột thì có cách nào để tham chiếu đến nó không ạ?

Bạn có cách đơn giản sau: Ghi cụm từ này vô 1 name

Sau đó dùng fương thức FIND() trong toàn bộ vùng đã sử dụng của trang tính.

- dòng lệnh: If ActiveCell.Value = "" And ActiveCell.Offset(1, 0).Value = "" And ActiveCell.Offset(2, 0).Value = "" Then Exit Sub có nghĩa là nếu trong cột có 3 ô liên tiếp là trống thì sẽ thoát khỏi sub. Em dùng lệnh này để thoát khỏi sub vì trong cột không có 3 ô liên tiếp trống. Nếu như trong cột đó chẳng may có 3 ô liên tiếp trống thật mà ở dưới còn dữ liệu thì sẽ thoát mất. Cho e hỏi có cách nào để khắc phục điều này không ạ?

Có cách là bạn tìm ô cuối có dữ liệu của 1 cột bằng fương thức End(xlUp)
Sau đó hễ vòng lặp chạy đến ô tận cùng này thì thoát.

- Trong câu lệnh for i=1 to 50 của em thì chỉ tham chiếu được 50 lần, nghĩa là nếu khoảng cách giữa 2 ô có nội dung "Đơn giá dự thầu" lớn hơn 50 hàng thì không thể tham chiếu được tiếp. Có có cách nào để tham chiếu được đến ô "Đơn giá dự thầu" kế tiếp gần nhất, và khi tham chiếu được thì dừng lại không ạ? Tương tự với dòng for j=1 to 120
- Tương tự em cũng muốn hỏi câu lệnh nào có thể tham chiếu tới một ô có thuộc tính đặc biệt như là ô có giá trị cho trước, . . . .

Bạn nên áp dụng FIND() như đầu tiên đã đề cập.

ô được tô màu sẵn, ô có định dạng là text (custom)... Và cách để tham chiếu đến ô gần nhất (xa nhất, hoặc ở vị trí xác định) so với ô đang được lựa chọn.

"Ô được tô màu sẵn": (E2003) Tìm lần lượt từng ô trong vùng có dữ liệu (Vùng đã sử dụng)
"Và cách để tham chiếu đến ô gần nhất (xa nhất, hoặc ở vị trí xác định) so với ô đang được lựa chọn."
Ta thử xài fương thức Offset(X,Y) trước khi xài cái khác

Chúc ngày làm việc hiệu quả!
 
Upvote 0
cám ơn anh

Bạn có cách đơn giản sau: Ghi cụm từ này vô 1 name

Sau đó dùng fương thức FIND() trong toàn bộ vùng đã sử dụng của trang tính.



Có cách là bạn tìm ô cuối có dữ liệu của 1 cột bằng fương thức End(xlUp)
Sau đó hễ vòng lặp chạy đến ô tận cùng này thì thoát.



Bạn nên áp dụng FIND() như đầu tiên đã đề cập.



"Ô được tô màu sẵn": (E2003) Tìm lần lượt từng ô trong vùng có dữ liệu (Vùng đã sử dụng)
"Và cách để tham chiếu đến ô gần nhất (xa nhất, hoặc ở vị trí xác định) so với ô đang được lựa chọn."
Ta thử xài fương thức Offset(X,Y) trước khi xài cái khác

Chúc ngày làm việc hiệu quả!

Cám ơn bác đã gợi ý, để em về ngâm cứu tiếp. Tiện đây bác cho em hỏi thêm là trong VBA có cách nào tham chiếu đến ô mà ô hiện tại link đến không ạ. Em vẫn dùng phím Ctrl+[ để đi đến ô đó mà không biết lệnh trong VBA
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom