toandiennuoc123
Thành viên thường trực




- Tham gia
- 7/3/12
- Bài viết
- 239
- Được thích
- 9








Bạn xem file đính kèm chưa ? Đếm các ô từ ô có màu thứ 1 đến ô có màu thứ 2Đếm khoảng cách như thế nào hả bạn?




Chào tất cả các bạn ! Tôi có 1 bài tìm khoảng cách giữa các ô có màu, các bạn xem file đính kèm, xin cám ơn các bạn.
Sub Kycuc()
Dim item, Mem, Odau, Ocuoi, i, Vitri1, Vitri2
For Each item In Range("A5:AE100")
If item.Interior.ColorIndex <> xlNone Then
Mem = Mem + 1
If Mem = 1 Then
Odau = item.Value
Vitri1 = item.Address(0, 0)
End If
Else
If Mem = 1 Then i = i + 1
End If
If Mem = 2 Then
Ocuoi = item.Value
Vitri2 = item.Address(0, 0)
Exit For
End If
Next
MsgBox "Khoang cach la: " & i & vbLf & _
"Vi tri dau la: " & Vitri1 & vbLf & _
"Gia tri dau la: " & Odau & vbLf & _
"Vi tri cuoi la: " & Vitri2 & vbLf & _
"Gia tri cuoi la: " & Ocuoi
End Sub








Cám ơn QuangHai , bạn có thể cho kết quả vào ô đã được chỉ định được không ? vì khi sử dụng bảng tính thì MsgBox nó biến mất nên không tiện sử dụng
Sub t()
Const ODAU = "A1"
Const OCUOI = "AE100"
Dim cll(1 To 2) As Range, c As Variant, num As Integer
For Each c In Range(ODAU, OCUOI)
If c.Interior.ColorIndex <> xlNone Then
num = num + 1
Set cll(num) = c
End If
If num >= 2 Then Exit For
Next c
If num < 2 Then
MsgBox "cha co du 2 o mau, khong tinh gi duoc ca"
Else
num = Range(OCUOI).Column - Range(ODAU).Column + 1
Range("ô cần chứa số ô").Value = num * (cll(2).Row - cll(1).Row) + cll(2).Column - cll(1).Column - 1
Range("ô cần chứa địa chỉ 1").Value = cll(1).Address
Range("ô cần chứa địa chỉ 2").Value = cll(2).Address
Range("ô cần chứa trị 1").Value = cll(1).Value
Range("ô cần chứa trị 2").Value = cll(2).Value
End If
Set cll(1) = Nothing
Set cll(2) = Nothing
End Sub




Bài này sửa thế nào nếu có nhiều ô có màu ( giả sử trong a1:af100 có 50 ô có màu ) thì đếm như thế nào nhỉ ?@quanghai1969: cứ nghe hai từ "bài tập" là biết ngay loại bài dọn cỗ. Không có ai siêng mà tải code của bạn về sửa lại đâu.
Mã:Sub t() Const ODAU = "A1" Const OCUOI = "AE100" Dim cll(1 To 2) As Range, c As Variant, num As Integer For Each c In Range(ODAU, OCUOI) If c.Interior.ColorIndex <> xlNone Then num = num + 1 Set cll(num) = c End If If num >= 2 Then Exit For Next c If num < 2 Then MsgBox "cha co du 2 o mau, khong tinh gi duoc ca" Else num = Range(OCUOI).Column - Range(ODAU).Column + 1 Range("ô cần chứa số ô").Value = num * (cll(2).Row - cll(1).Row) + cll(2).Column - cll(1).Column - 1 Range("ô cần chứa địa chỉ 1").Value = cll(1).Address Range("ô cần chứa địa chỉ 2").Value = cll(2).Address Range("ô cần chứa trị 1").Value = cll(1).Value Range("ô cần chứa trị 2").Value = cll(2).Value End If Set cll(1) = Nothing Set cll(2) = Nothing End Sub
Bài này sửa thế nào nếu có nhiều ô có màu ( giả sử trong a1:af100 có 50 ô có màu ) thì đếm như thế nào nhỉ ?




Loay hoay mãi không được, bạn sửa giúp tôi nhé !Tôi biết thể nào bạn cũng hỏi chỗ này nên code trên đã chuẩn bị sẵn.
Sửa:
Trong vòng lặp thu thập dữ liệu: những con số 2 có ý nghĩa là giới han sửa lại thành số tối đa
Trong code ghi kết quả: dùng vòng lặp để ghi, những son số 1 và 2 có ý nghĩa thứ tự thì sử thành i và i+1
Sub t()
Const ODAU = "A1"
Const OCUOI = "AE100"
Dim cll(1 To 1000) As Range, c As Variant, num As Integer
For Each c In Range(ODAU, OCUOI)
If c.Interior.ColorIndex <> xlNone Then
num = num + 1
Set cll(num) = c
End If
Next c
If num < 2 Then
MsgBox "co duoi 2 o mau, khong tinh gi duoc ca"
Else
For i = 1 To num - 1
Range("AG1").Offset(1, i).Value = (Range(OCUOI).Column - Range(ODAU).Column + 1) * (cll(i + 1).Row - cll(i).Row) _
+ cll(i + 1).Column - cll(i).Column - 1
Range("AG1").Offset(2, i).Value = cll(i).Address
Range("AG1").Offset(3, i).Value = cll(i + 1).Address
Range("AG1").Offset(4, i).Value = cll(i).Value
Range("AG1").Offset(5, i).Value = cll(i + 1).Value
Next i
End If
End Sub




Không lường được hết vấn đề nên đặt câu hỏi không chuẩn, mong bạn thông cảm. Code này nó không nhận màu trong CF...........Rất mong được sự giúp đỡ của bạn !Mã:Sub t() Const ODAU = "A1" Const OCUOI = "AE100" Dim cll(1 To 1000) As Range, c As Variant, num As Integer For Each c In Range(ODAU, OCUOI) If c.Interior.ColorIndex <> xlNone Then num = num + 1 Set cll(num) = c End If Next c If num < 2 Then MsgBox "co duoi 2 o mau, khong tinh gi duoc ca" Else For i = 1 To num - 1 Range("AG1").Offset(1, i).Value = (Range(OCUOI).Column - Range(ODAU).Column + 1) * (cll(i + 1).Row - cll(i).Row) _ + cll(i + 1).Column - cll(i).Column - 1 Range("AG1").Offset(2, i).Value = cll(i).Address Range("AG1").Offset(3, i).Value = cll(i + 1).Address Range("AG1").Offset(4, i).Value = cll(i).Value Range("AG1").Offset(5, i).Value = cll(i + 1).Value Next i End If End Sub




Thử code nàyKhông lường được hết vấn đề nên đặt câu hỏi không chuẩn, mong bạn thông cảm. Code này nó không nhận màu trong CF...........Rất mong được sự giúp đỡ của bạn !
Sub Kycuc()
Dim item, Mem, Odau, Ocuoi, i, Vitri1, Vitri2
For Each item In Range("A5:AE100")
If item.DisplayFormat.Interior.ColorIndex <> xlNone Then
Mem = Mem + 1
If Mem = 1 Then
Odau = item.Value
Vitri1 = item.Address(0, 0)
End If
Else
If Mem = 1 Then i = i + 1
End If
If Mem = 2 Then
Ocuoi = item.Value
Vitri2 = item.Address(0, 0)
Exit For
End If
Next
[AG1].Value = i
[AJ1].Value = Vitri1
[AK1].Value = Odau
[AJ2].Value = Vitri2
[AK2].Value = Ocuoi
End Sub




Về màu thì OK rồi nhưng nó tìm được mỗi một vị trí, mà cái mình cần là n vị trí " Dim cll(1 To 1000) As Range ". Mong QuangHai giúp đỡ tiếp.......Chân thành cám ơnThử code này
PHP:Sub Kycuc() Dim item, Mem, Odau, Ocuoi, i, Vitri1, Vitri2 For Each item In Range("A5:AE100") If item.DisplayFormat.Interior.ColorIndex <> xlNone Then Mem = Mem + 1 If Mem = 1 Then Odau = item.Value Vitri1 = item.Address(0, 0) End If Else If Mem = 1 Then i = i + 1 End If If Mem = 2 Then Ocuoi = item.Value Vitri2 = item.Address(0, 0) Exit For End If Next [AG1].Value = i [AJ1].Value = Vitri1 [AK1].Value = Odau [AJ2].Value = Vitri2 [AK2].Value = Ocuoi End Sub




Cám ơn bạn Vetmini, thực ra tôi cũng không muốn màu mè nhưng bài này là tìm khoảng cách giữa 2 ô có màu (CF) lọc trùng mà. Rất cám ơn bạn đã nhiệt tình giúp đỡTrong Excel 2010 có cách để nhận CF. 2007 trở về trước thì phải thêm code rất dài dòng.
Tôi vốn không chuyên về màu (*), bạn nên chờ người khác giúp vậy.
(*) môi trường nơi tôi làm việc vốn nhạy cảm với màu cho nên tôi ít khi để ý tới vấn đề này.
Tôi tiếp xúc với nhiều thành phần. Tuy tỷ lệ mù màu không nhiều, nhưng nếu đưa cho họ một file có màu thì rất khó chịu, phải lựa những màu thế nào cho họ có thể phân biệt được. Vì vậy tôi chỉ chú trọng cách trình bày lô gic vị trí dữ liệu thay vì dùng màu mè.
Nói thật, đọc ở diễn đàn này có nhiều files dùng màu như trang trí tuồng cải lương, nhiều ô màu xậm đến độ không đọc chữ nổi, đem ra ngoài sẽ bị sổ toẹt hết.
Bổ sung: pót xong mới thấy bài #14. Như tôi đã nêu trên, nếu bạn dùng Exxcel 2010 thì có thể dùng code bài #14 này để nhận màu dễ dàng.




Cám ơn bạn. Phải nói là thành công 99% rồi, nhưng "lại nhưng" còn 1 vấn đề nữa là để kết quả theo hàng ngang thì nó bị tràn bảng tính ( Office 2013 --> lưu file 97-2003) nó chỉ có 256 cột thôi, bây giờ tôi muốn chuyển nó thành hàng dọc (BC109:BC65000). bạn giúp tôi nhé !? Chân thành cám ơnNếu dùng 2010 thì sửa Interior.ColorIndex thành DisplayFormat.Interior.ColorIndex
chỉ vậy thôi. Tuy nhiên, phải cẩn thận là code này chỉ chạy với VBA, nếu dùng cho hàm người dùng (UDF) thì sẽ bị lỗi.
dim ghi as range
set ghi = Range("B109")
For i = 1 To num - 1
ghi.Offset(0).Value = (Range(OCUOI).Column - Range(ODAU).Column + 1) * (cll(i + 1).Row - cll(i).Row) _
+ cll(i + 1).Column - cll(i).Column - 1
ghi.Offset(1).Value = cll(i).Address
ghi.Offset(2).Value = cll(i + 1).Address
ghi.Offset(3).Value = cll(i).Value
ghi.Offset(4).Value = cll(i + 1).Value
set ghi = ghi.Offset(5)
Next i
set ghi = nothing