Nhờ sửa code format bảng có kèm theo điều kiện

Liên hệ QC

thao_tedi

Thành viên mới
Tham gia
14/2/09
Bài viết
14
Được thích
3
Em có một bảng có a dòng và b cột. Điều kiện là trong cùng một dòng nếu có một giá trị trong hàng bằng với giá trị cuối cùng của hàng thì bôi đỏ (định dạng ô đó). Em có lập một marco như sau:
PHP:
Sub Boido()
 Dim Vungtra As Range
 Dim i As Integer, j As Integer,  a As Integer,  b As Integer
Set Vungtra = Selection

a = Vungtra.Rows.Row
MsgBox "The number of Row is ", a
b = Vungtra.Columns.Column
MsgBox "The number of Colum is ", b
For i = 1 To a
    For j = 1 To b - 1
         If Cells(i, j).Value = Cells(i, b).Value Then
              With Cells(i, j).Font
                    .FontStyle = "Italic"
                    .Color = 255
              End With
         Else
              With Cells(i, j).Font
                     .FontStyle = "Normal"
                     .Color = 1
              End With
         End If
    Next j
Next i
End Sub

Nhưng khi chạy thì không thấy thực hiện gì cả. Em đoán thủ tục chọn vùng Set Vungtra = Selection có vấn đề nhưng không biết sửa như thế nào. Mong các bác giúp em.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Em có một bảng có a dòng và b cột. Điều kiện là trong cùng một dòng nếu có một giá trị trong hàng bằng với giá trị cuối cùng của hàng thì bôi đỏ (định dạng ô đó). Em có lập một marco như sau:
Sub Boido()
Dim Vungtra As Range
Dim i As Integer
Dim j As Integer
Dim a As Integer
Dim b As Integer
Set Vungtra = Selection
a = Vungtra.Rows.Row
MsgBox "The number of Row is ", a
b = Vungtra.Columns.Column
MsgBox "The number of Colum is ", b
For i = 1 To a
For j = 1 To b - 1
If Cells(i, j).Value = Cells(i, b).Value Then
With Cells(i, j).Font
.FontStyle = "Italic"
.Color = 255
End With
Else
With Cells(i, j).Font
.FontStyle = "Normal"
.Color = 1
End With
End If
Next j
Next i
End Sub

Nhưng khi chạy thì không thấy thực hiện gì cả. Em đoán thủ tục chọn vùng Set Vungtra = Selection có vấn đề nhưng không biết sửa như thế nào. Mong các bác giúp em. File
Cần gì phải sử dụng VBA. Nếu yêu cầu của bạn chỉ có thế thì chức năng Conditional Formatting dư sức làm. Mời bạn xem file. Data | Conditional Formatting để xem công thức.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em có một bảng có a dòng và b cột. Điều kiện là trong cùng một dòng nếu có một giá trị trong hàng bằng với giá trị cuối cùng của hàng thì bôi đỏ (định dạng ô đó). Em có lập một marco như sau:


Sub Boido()
Dim Vungtra As Range
Dim i As Integer
Dim j As Integer
Dim a As Integer
Dim b As Integer
Set Vungtra = Selection
a = Vungtra.Rows.Row <== Count
MsgBox "The number of Row is ", a
b = Vungtra.Columns.Column <== Count
MsgBox "The number of Colum is ", b
For i = 1 To a
For j = 1 To b - 1
If Cells(i, j).Value = Cells(i, b).Value Then
With Cells(i, j).Font
.FontStyle = "Italic"
.Color = 255
End With
Else
With Cells(i, j).Font
.FontStyle = "Normal"
.Color = 1
End With
End If
Next j
Next i
End Sub


Nhưng khi chạy thì không thấy thực hiện gì cả. Em đoán thủ tục chọn vùng Set Vungtra = Selection có vấn đề nhưng không biết sửa như thế nào. Mong các bác giúp em. File

Bạn xem chổ bôi đỏ nha
 
Upvote 0
Em có một bảng có a dòng và b cột. Điều kiện là trong cùng một dòng nếu có một giá trị trong hàng bằng với giá trị cuối cùng của hàng thì bôi đỏ (định dạng ô đó). Em có lập một marco như sau:
Sub Boido()
Dim Vungtra As Range
Dim i As Integer
Dim j As Integer
Dim a As Integer
Dim b As Integer
Set Vungtra = Selection
a = Vungtra.Rows.Row
MsgBox "The number of Row is ", a
b = Vungtra.Columns.Column
MsgBox "The number of Colum is ", b
For i = 1 To a
For j = 1 To b - 1
If Cells(i, j).Value = Cells(i, b).Value Then
With Cells(i, j).Font
.FontStyle = "Italic"
.Color = 255
End With
Else
With Cells(i, j).Font
.FontStyle = "Normal"
.Color = 1
End With
End If
Next j
Next i
End Sub

Nhưng khi chạy thì không thấy thực hiện gì cả. Em đoán thủ tục chọn vùng Set Vungtra = Selection có vấn đề nhưng không biết sửa như thế nào. Mong các bác giúp em. File
Bài này đúng là nên dùng Conditional Formating mà làm cho gọn! Cọn nếu muốn thực tập code thì... Ẹc.. Ẹc... Code dài thấy ớn luôn
Cái này nè bạn ơi
PHP:
Sub Boido()
  Dim Clls As Range, Check As Boolean
  With Selection
    For Each Clls In .Resize(, .Columns.Count - 1)
      Check = Clls.Value = Cells(Clls.Row, .Column + .Columns.Count - 1).Value
      Clls.Font.ColorIndex = -3 * Check
    Next Clls
  End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các bác. Code bác dùng ngon dễ sợ.
Một lần nữa xin cám ơn các bác nhiều. Chúc các bác mạnh khỏe.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các bác. Code bác dùng ngon dễ sợ. Em dùng Conditional Format rồi, nhưng ghét cái là cứ phải làm cho từng dòng 1. Conditional Format không copy được format (hay tại e dốt quá!).
Một lần nữa xin cám ơn các bác nhiều. Chúc các bác mạnh khỏe.
Sao lại làm cho từng dòng một. Muốn Conditional Format copy được bạn phải chỉnh lại cách tham chiếu cho hợp lý (Tham chiếu tương đối hay tuyệt đối...). Bạn xem file ở bài #2 của tôi. Vào Conditional Format thao khảo công thức. Tôi làm một lần cho cả bảng tính.
 
Upvote 0
Cám ơn các bác. Code bác dùng ngon dễ sợ. Em dùng Conditional Format rồi, nhưng ghét cái là cứ phải làm cho từng dòng 1. Conditional Format không copy được format (hay tại e dốt quá!).
Một lần nữa xin cám ơn các bác nhiều. Chúc các bác mạnh khỏe.
Nếu bài này đê tham khảo cách viết code thì không có vấn đề, còn để dùng thật sự, hãy tham khảo cách làm của bạn Huuthang (Format 1 lần thôi chứ sao phải làm từng dòng) ----> Nếu không, người ta sẽ cho rằng bạn không biết xài Excel (chứ chẳng phải Pro gì)
 
Upvote 0
Em down file của bác huuthang_bd rồi. Cám ơn các bác... Bác Thắng làm ơn giải thích dùm ý nghĩa của cái code = A1=$I1 trong Rule Applied in order shown Formula: = A1 = $I1 được không? Em thử bỏ = A1 đi thì nó bôi đỏ hết luôn..
 
Upvote 0
Muốn thực tập code thì... Ẹc.. Ẹc... Code dài thấy ớn luôn
Cái này nè bạn ơi
PHP:
Sub Boido()
  Dim Clls As Range, Check As Boolean
  With Selection
    For Each Clls In .Resize(, .Columns.Count - 1)
      Check = Clls.Value = Cells(Clls.Row, .Column + .Columns.Count - 1).Value
      Clls.Font.ColorIndex = -3 * Check
    Next Clls
  End With
End Sub

Cái ni dài nè, nhưng cạnh tranh được với hắn về tốc độ đó

PHP:
Sub ToDo()
 Dim Rng As Range, sRng As Range, Clls As Range
 Dim Col As Byte
 
 With Selection
   Col = .Columns.Count
   Set sRng = Range(.Cells(1, 1), .End(xlDown)).Offset(, Col - 1)
   For Each Clls In sRng
'      Dem = Dem + 1  '
      Set Rng = Range(Clls.Offset(, -1), Clls.Offset(, -Col + 1))
      If Not Rng.Find(Clls.Value, , xlFormulas, xlWhole) Is Nothing Then _
         Rng.Interior.ColorIndex = 35
   Next Clls
 End With
End Sub
 
Upvote 0
Em down file của bác huuthang_bd rồi. Cám ơn các bác... Bác Thắng làm ơn giải thích dùm ý nghĩa của cái code = A1=$I1 trong Rule Applied in order shown Formula: = A1 = $I1 được không? Em thử bỏ = A1 đi thì nó bôi đỏ hết luôn..
Sao mà bỏ đi được. Công thức trong Conditional Formating phải trả về giá trị True hoặc False. Nếu không phải True, False thì Excel sẽ tự chuyển về dạng này. Kiểu chuỗi và kiểu số có giá trị =0 thì chuyển về False, Kiểu số giá trị <>0 thì chuyển về True. Khi bạn bỏ =A1 thì công thức còn lại là =$I1. Mà I1 là số lại <>0 nên nó bôi hết là đúng rồi.
Về công thức:
Mã:
=A1=$I1
Đơn giản thôi mà
Ô nào có giá trị bằng ô I1 thì bôi, không thì thôi. Nhưng chú ý cách tham chiếu:
A1 không cố định để khi copy công thức thì địa chỉ tham chiếu sẽ chạy theo.
$I1 cố định cột để khi copy công thức địa chỉ sẽ chạy dọc theo cột I.
 
Upvote 0
Bạn xem chổ bôi đỏ nha

Cám ơn bác nhiều. E làm lại nó ngắn hơn một chút.
Sub Boido()
Dim i, j, a, b As Integer
With Selection
a = .Rows.Count
b = .Columns.Count
End With
For i = 1 To a
For j = 1 To b - 1
If Cells(i, j).Value = Cells(i, b).Value Then
With Cells(i, j).Font
.FontStyle = "Italic"
.Color = 255
End With
End If
Next j
Next i
End Sub
 
Upvote 0
Cái ni dài nè, nhưng cạnh tranh được với hắn về tốc độ đó

PHP:
Sub ToDo()
 Dim Rng As Range, sRng As Range, Clls As Range
 Dim Col As Byte
 
 With Selection
   Col = .Columns.Count
   Set sRng = Range(.Cells(1, 1), .End(xlDown)).Offset(, Col - 1)
   For Each Clls In sRng
'      Dem = Dem + 1  '
      Set Rng = Range(Clls.Offset(, -1), Clls.Offset(, -Col + 1))
      If Not Rng.Find(Clls.Value, , xlFormulas, xlWhole) Is Nothing Then _
         Rng.Interior.ColorIndex = 35
   Next Clls
 End With
End Sub
Đúng là nhanh hơn nhiều lần so với code của em... Vì sư phụ chỉ quét duy nhất 1 cột
Có điều là... sư phụ đã hiểu lầm yêu cầu của tác giả rồi... Ẹc.. Ẹc...
Ô nào tìm thấy đúng điều kiện thì tô màu CHỈ Ô ĐÓ mà thôi (chứ hỏng phải tô cả dòng)
(Nếu không thì em cũng đã... Find ngay từ đầu rồi)
----------------------------------------------
Với bạn thao_tedi
Cám ơn bác nhiều. E làm lại nó ngắn hơn một chút.
Sub Boido()
Dim i, j, a, b As Integer
With Selection
a = .Rows.Count
b = .Columns.Count
End With
For i = 1 To a
For j = 1 To b - 1
If Cells(i, j).Value = Cells(i, b).Value Then
With Cells(i, j).Font
.FontStyle = "Italic"
.Color = 255
End With
End If
Next j
Next i
End Sub
Đàng nào ta cũng phải dùng vòng lập For để quét toàn bộ vùng chọn (trừ cột cuối) ---> Vậy thì ta dùng For Each chứ ai lại For i... j gì đó cho dài dòng chứ...
Bạn suy nghĩ xem!
 
Lần chỉnh sửa cuối:
Upvote 0
NDU:
Ô nào tìm thấy đúng điều kiện thì tô màu CHỈ Ô ĐÓ mà thôi (chứ hỏng phải tô cả dòng)

Chuyện nhỏ như con thỏ ăn cỏ í mà! Lúc đó sửa dòng lệnh lại xíu là được mà!
Thay vì:
Rng.Interior.ColorIndex = 35

sẽ là

Rng.Find(Clls.Value).Font.ColorIndex = 3

Chỉ khi nào trong dòng có hơn 1 ô giống với dữ liệu ô cuối thì phải thêm biến chuõi đễ thoát vòng Do . . Loop khi FINDNEXT() mà thôi;
Nhưng có vậy cũng nhanh hơn nhiều so với For Each . . . Next
 
Upvote 0
Chuyện nhỏ như con thỏ ăn cỏ í mà! Lúc đó sửa dòng lệnh lại xíu là được mà!
Thay vì:
Rng.Interior.ColorIndex = 35

sẽ là

Rng.Find(Clls.Value).Font.ColorIndex = 3

Chỉ khi nào trong dòng có hơn 1 ô giống với dữ liệu ô cuối thì phải thêm biến chuõi đễ thoát vòng Do . . Loop khi FINDNEXT() mà thôi;
Nhưng có vậy cũng nhanh hơn nhiều so với For Each . . . Next
Vâng! Đồng ý ở điểm này!
Nhưng em vẩn không an tâm ở chổ End(xlDown) ---> (lở ai đó xóa 1 ô thì toi)
Nên em dự tính sửa lại code sư phụ thành:
PHP:
Sub ToDo()
 Dim Clls As Range
 With Selection
   For Each Clls In .Offset(, .Columns.Count - 1).Resize(, 1)
      With Clls.Offset(, 1 - .Columns.Count).Resize(, .Columns.Count - 1)
        If Not .Find(Clls.Value, , xlFormulas, xlWhole) Is Nothing Then _
          .Find(Clls.Value).Font.ColorIndex = 3
      End With
   Next Clls
 End With
End Sub
Sư phụ thấy sao?
 
Upvote 0
Web KT

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

Back
Top Bottom