Hiện các dòng của target (4 người xem)

Liên hệ QC

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

Ng_Duy_Long

Thành viên mới
Tham gia
7/2/07
Bài viết
47
Được thích
24
Giả sử target là A1:D5 và E7:F10 thì các dòng của target là 1, 2, 3, 4, 5, 7, 8, 9, 10, các bạn cho mình hỏi: làm thế nào để hiển thị các dòng của target.
 
Mình không hiểu ý bạn lắm. Dùng hàm Row() thử xem có đúng ý bạn không.
 
Bạn thử với macro này xem sao

PHP:
Option Explicit
Sub HienDong()
 Dim StrC As String, SChu As String:           Dim Clls As Range
 
 StrC = "GPE"
 For Each Clls In Selection
   If InStr(StrC, "R" & Clls.Row) < 1 Then
      SChu = SChu & " " & Clls.Row
      StrC = StrC & "R" & Clls.Row
   End If
 Next Clls
 MsgBox SChu
End Sub
:-=
 
Cảm ơn bác HYEN17. Ý em là msgbox hiện từng dòng một chứ ko phải hiện tất cả vào 1 msgbox. Có file đính kèm
 

File đính kèm

Cảm ơn bác HYEN17. Ý em là msgbox hiện từng dòng một chứ ko phải hiện tất cả vào 1 msgbox. Có file đính kèm
Bạn thử code này thử xem
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range
Dim a As Integer
For Each Rng In Selection
If a < Rng.Row Then
MsgBox Rng.Row
a = Rng.Row
End If
Next
End Sub
 
Bạn thử code này thử xem

Macro này của HuuThang_BD chỉ đúng 1 chiều thôi, lúc mà chúng ta dùng chuột chọn các ô từ trên xuống( từ hàng bé đến hàng lớn);
Nếu cắt cớ chọn từ dưới lên sẽ chỉ cho 1 dòng duy nhứt mà thôi!

Ví dụ tôi chọn lần lượt là B9:C8, tiếp sau đó B2:A2 & C1:D1 thì hiển thị 1 lần msgbox mà thôi!

Nếu muốn mỗi lần đều hiễn thị thì còn bớt 1 dòng lệnh trong macro của mình nữa là đằng khác:

PHP:
Option Explicit[/color]
Sub HienDong()
 Dim StrC As String, SChu As String:           Dim Clls As Range
 
 StrC = "GPE"
 For Each Clls In Selection
   If InStr(StrC, "R" & Clls.Row) < 1 Then
      MsgBox Clls.Row
      StrC = StrC & "R" & Clls.Row
   End If
 Next Clls
' MsgBox SChu '
End Sub
)(&&@@
 
Macro này của HuuThang_BD chỉ đúng 1 chiều thôi, lúc mà chúng ta dùng chuột chọn các ô từ trên xuống( từ hàng bé đến hàng lớn);
Nếu cắt cớ chọn từ dưới lên sẽ chỉ cho 1 dòng duy nhứt mà thôi!

Ví dụ tôi chọn lần lượt là B9:C8, tiếp sau đó B2:A2 & C1:D1 thì hiển thị 1 lần msgbox mà thôi!

Nếu muốn mỗi lần đều hiễn thị thì còn bớt 1 dòng lệnh trong macro của mình nữa là đằng khác:

PHP:
Option Explicit[/color]
Sub HienDong()
 Dim StrC As String, SChu As String:           Dim Clls As Range
 
 StrC = "GPE"
 For Each Clls In Selection
   If InStr(StrC, "R" & Clls.Row) < 1 Then
      MsgBox Clls.Row
      StrC = StrC & "R" & Clls.Row
   End If
 Next Clls
' MsgBox SChu '
End Sub
)(&&@@
Nhưng mà Macro này thì nó hiện số không theo thứ tự gì hết. Cell nào được duyệt trước thì nó hiện trước chứ không theo một thứ tự nhất định.
 
Tại sao phải duyệt cả Selection? Có phải là quá thừa không?
Đàng nào cũng chỉ lấy CHỈ SỐ DÒNG, vậy chỉ cần duyệt 1 cột thôi là đủ ---> Và đương nhiên tốc độ của code sẽ nhanh hơn
Lưu ý: Với các vùng không liên tục, có thể duyệt qua từng Areas ---> Mổi Areas chỉ cần duyệt 1 cột
 
Macro này của HuuThang_BD chỉ đúng 1 chiều thôi, lúc mà chúng ta dùng chuột chọn các ô từ trên xuống( từ hàng bé đến hàng lớn);
Nếu cắt cớ chọn từ dưới lên sẽ chỉ cho 1 dòng duy nhứt mà thôi!

Ví dụ tôi chọn lần lượt là B9:C8, tiếp sau đó B2:A2 & C1:D1 thì hiển thị 1 lần msgbox mà thôi!

Nếu muốn mỗi lần đều hiễn thị thì còn bớt 1 dòng lệnh trong macro của mình nữa là đằng khác:

PHP:
Option Explicit[/color]
Sub HienDong()
 Dim StrC As String, SChu As String:           Dim Clls As Range
 
 StrC = "GPE"
 For Each Clls In Selection
   If InStr(StrC, "R" & Clls.Row) < 1 Then
      MsgBox Clls.Row
      StrC = StrC & "R" & Clls.Row
   End If
 Next Clls
' MsgBox SChu '
End Sub
)(&&@@
Đoạn Macro này cũng chưa đúng, nếu chọn A10 và F1 thì nó chỉ báo mỗi dòng 10 vì
PHP:
InStr("GPER10","R1")=4 '(>=1)
Code này có lẽ chậm hơn nhưng nó sẽ hiện theo thứ tự tăng dần.
PHP:
Sub Hiendong()
Dim Rng As Range, MyRng As Range
Dim Str As String
Dim Row_ As Long
Set MyRng = Range(Replace(Selection.EntireRow.Address, "$", "A"))
For Each Rng In MyRng
If InStr(Str, "A" & Format(Rng.Row, "00000")) = 0 Then
    Str = Str & "A" & Format(Rng.Row, "00000")
    If Rng.Row > Row_ Then
    Row_ = Rng.Row
    End If
End If
Next
For i = 1 To Row_
If InStr(Str, "A" & Format(i, "00000")) > 0 Then
MsgBox i
End If
Next
End Sub
 
Chưa thấy Code, chưa tin, hì. ., hì . . .

tại sao phải duyệt cả selection? Có phải là quá thừa không?
đàng nào cũng chỉ lấy chỉ số dòng, vậy chỉ cần duyệt 1 cột thôi là đủ ---> và đương nhiên tốc độ của code sẽ nhanh hơn
lưu ý: Với các vùng không liên tục, có thể duyệt qua từng areas ---> mổi areas chỉ cần duyệt 1 cột

:-= --=0 -=.,, )(&&@@ --=-- !$@!!
 
Cảm ơn các bạn đã giúp đỡ
To ndu96081631
Bạn có thể nói mục đích của bạn được không?
Chứ tôi thấy ý tưởng về code này nó... vô bổ sao ấy!
Mục đích của đề tài này là: em có 1 sheet So quy, 1 sheet So nhat ky chung. Khi nhập liệu vào số quỹ thì đồng thời nhập vào sổ nhật ký chung, các giá trị ở 2 sheet này chỉ ở dạng value vì vậy khi sửa phiếu thu, chi ở sổ quỹ thì phải sửa bằng tay ở sổ nhật ký chung. Em muốn biết chỉ số dòng của selection để dùng phương thức Find để tìm chỉ số dòng chứng từ ở sheet So nhat ky chung, từ đó tự động thay đổi nội dung của phiếu thu, chi ở sheet So nhat ky chung. Các bác giúp đỡ luôn nhé. Có file đính kèm
 

File đính kèm

Tại sao phải duyệt cả Selection? Có phải là quá thừa không?
Đàng nào cũng chỉ lấy CHỈ SỐ DÒNG, vậy chỉ cần duyệt 1 cột thôi là đủ ---> Và đương nhiên tốc độ của code sẽ nhanh hơn
Lưu ý: Với các vùng không liên tục, có thể duyệt qua từng Areas ---> Mổi Areas chỉ cần duyệt 1 cột
Không rõ ý của NDU có phải thế này không?
Mã:
Sub Test()
    Dim rng As Range
    Set rng = Selection
    Dim i As Long
    Dim iRowTop As Long
    Dim iRowBottom As Long
    iRowTop = rng.Row
    iRowBottom = iRowTop + rng.Rows.Count - 1
    For i = 1 To rng.Areas.Count
        If iRowTop > rng.Areas(i).Row Then iRowTop = rng.Areas(i).Row
        If iRowBottom < rng.Areas(i).Row + rng.Areas(i).Rows.Count - 1 Then iRowBottom = rng.Areas(i).Row + rng.Areas(i).Rows.Count - 1
    Next
    
    For i = iRowTop To iRowBottom
        If Not Intersect(Range(i & ":" & i), rng) Is Nothing Then MsgBox i
    Next
End Sub
 
Không rõ ý của NDU có phải thế này không?
Mã:
Sub Test()
    Dim rng As Range
    Set rng = Selection
    Dim i As Long
    Dim iRowTop As Long
    Dim iRowBottom As Long
    iRowTop = rng.Row
    iRowBottom = iRowTop + rng.Rows.Count - 1
    For i = 1 To rng.Areas.Count
        If iRowTop > rng.Areas(i).Row Then iRowTop = rng.Areas(i).Row
        If iRowBottom < rng.Areas(i).Row + rng.Areas(i).Rows.Count - 1 Then iRowBottom = rng.Areas(i).Row + rng.Areas(i).Rows.Count - 1
    Next
    
    For i = iRowTop To iRowBottom
        If Not Intersect(Range(i & ":" & i), rng) Is Nothing Then MsgBox i
    Next
End Sub
Cách tôi làm cũng gần gần giống thế
PHP:
Sub Test()
  Dim i As Long, Clls As Range, k As Long
  With Selection
    For i = 1 To .Areas.Count
      For Each Clls In .Areas(i).Resize(, 1)
        If k < Clls.Row Then k = Clls.Row: MsgBox k
      Next
    Next
  End With
End Sub
Vẫn chưa hài lòng vì thật ra vẫn còn có thể tăng tốc trong trường hợp nhiều vùng chọn có chỉ số dòng trùng nhau
-------------------------
Với bạn Ng_Duy_Long
Ng_Duy_Long đã viết:
Mục đích của đề tài này là: em có 1 sheet So quy, 1 sheet So nhat ky chung. Khi nhập liệu vào số quỹ thì đồng thời nhập vào sổ nhật ký chung, các giá trị ở 2 sheet này chỉ ở dạng value vì vậy khi sửa phiếu thu, chi ở sổ quỹ thì phải sửa bằng tay ở sổ nhật ký chung. Em muốn biết chỉ số dòng của selection để dùng phương thức Find để tìm chỉ số dòng chứng từ ở sheet So nhat ky chung, từ đó tự động thay đổi nội dung của phiếu thu, chi ở sheet So nhat ky chung. Các bác giúp đỡ luôn nhé. Có file đính kèm
Các bài toán liên quan đến kế toán tôi không rành lắm (nhìn vào nó lơ mơ thế nào ấy) ---> Có lẽ phải xem các cao thủ (những ai chuyên ngành KT) làm trước mới đoán được ý bạn!
Hic..
Đoạn Macro này cũng chưa đúng, nếu chọn A10 và F1 thì nó chỉ báo mỗi dòng 10 vì
Bạn yên tâm vì khi ráp vào toàn bộ code, cái Selection ấy đâu phải ta chọn bằng tay!
 
Lần chỉnh sửa cuối:
Cách tôi làm cũng gần gần giống thế
PHP:
Sub Test()
  Dim i As Long, Clls As Range, k As Long
  With Selection
    For i = 1 To .Areas.Count
      For Each Clls In .Areas(i).Resize(, 1)
        If k < Clls.Row Then k = Clls.Row: MsgBox k
      Next
    Next
  End With
End Sub
Vẫn chưa hài lòng vì thật ra vẫn còn có thể tăng tốc trong trường hợp nhiều vùng chọn có chỉ số dòng trùng nhau
Code của tôi chính là đang muốn khắc phục nhược điểm này. Ở code của bạn có 2 vòng lặp, 1 vòng duyệt qua tất cả các Areas, 1 vòng duyệt qua tất cả các ô ở cột đầu tiên của mỗi Areas. Còn code của tôi cũng bao gồm 2 vòng lặp, 1 vòng duyệt qua tất cả các Areas(cái này giống của bạn), còn vòng lặp thứ 2 thì nó chỉ duyệt từ dòng trên cùng đến dòng cuối cùng của các Areas.
- Code của bạn chỉ chạy đúng nếu các vùng chọn lần lượt từ trên xuống dưới, nếu chọn từ dưới lên trên nó sẽ chạy không đúng nữa.
 
Code của tôi chính là đang muốn khắc phục nhược điểm này. Ở code của bạn có 2 vòng lặp, 1 vòng duyệt qua tất cả các Areas, 1 vòng duyệt qua tất cả các ô ở cột đầu tiên của mỗi Areas. Còn code của tôi cũng bao gồm 2 vòng lặp, 1 vòng duyệt qua tất cả các Areas(cái này giống của bạn), còn vòng lặp thứ 2 thì nó chỉ duyệt từ dòng trên cùng đến dòng cuối cùng của các Areas.
- Code của bạn chỉ chạy đúng nếu các vùng chọn lần lượt từ trên xuống dưới, nếu chọn từ dưới lên trên nó sẽ chạy không đúng nữa.
Ái dà.. đúng là sơ suất
Sao mình không nghĩ ra vụ:
If Not Intersect(Range(i & ":" & i), rng) Is Nothing Then
Đơn giản nhưng lợi hại thật!
------------------
Hồi trước có làm 1 bài liên quan đến BigRange:
http://www.giaiphapexcel.com/forum/showpost.php?p=113502&postcount=18
Vậy thì giờ áp dụng
PHP:
Sub Test()
  Dim BigRng As Range, i As Long, Clls As Range
  With Selection
    Set BigRng = .Areas(1)
    For i = 1 To .Areas.Count
      Set BigRng = Range(BigRng, .Areas(i))
    Next i
    For Each Clls In BigRng.Resize(, 1)
      If Not Intersect(Clls.EntireRow, .Cells) Is Nothing Then MsgBox Clls.Row
    Next Clls
  End With
End Sub
Vòng lập For cuối là thuật toán của Rollover79 ... có điều đoạn For ở trên tôi nghĩ là dể hiểu hơn mấy cái IF của bạn!
Ẹc.. Ẹc..
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom