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 ạ!
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:
