Giúp code tìm vị trí hàng của 1 chuỗi trong 1 vùng

Liên hệ QC

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả nhà GPE !.Đánh chử thì hơi lòng vòng em gửi hình mọi người xem sẽ hiểu ngay .( Lưu ý File đính kèm e demo cho mọi người hiểu chứ File thực tế dử liệu của em khoảng 30.000 dòng ) XIn chân thành cảm ơn !

1544282122921.png
 

File đính kèm

Nếu dữ liệu không quá nhiều, bạn thử code này ạ:
Mã:
Sub Macro1()
    Dim txtFind As Variant, lastRow As Long, i As Long
    txtFind = Range("e3").Value
    lastRow = Cells(Rows.Count, "b").End(xlUp).Row
    For Each cell In Range("b3:b" & lastRow)
        If UCase(cell.Value) = UCase(txtFind) Then
            Range("h3").Offset(i).Value = cell.Row
            i = i + 1
        End If
    Next cell
End Sub
 
Upvote 0
Bạn xài hàm tự tạo này sẽ được toại nguyện:
PHP:
Function LKDong(Rng As Range, KT As String)
 Dim Arr()
 Dim J As Long, W As Long
 
 Arr() = Rng.Value
 ReDim dArr(1 To UBound(Arr()), 1 To 1) As String
 For J = 1 To UBound(Arr())
    If UCase$(Arr(J, 1)) = UCase$(KT) Then
        W = W + 1:              dArr(W, 1) = CStr(J)
    End If
 Next J
 LKDong = dArr()
End Function
Cách xài: Lấy chuột chọn vùng [G3:G37];
Nhập lên thanh công thức =LKDong(B3:B30600,E3) &
cuối cùng kết thúc bỡi tổ hợp 3 fím giành riêng cho hàm mảng

Chúc vui!
 
Upvote 0
Chào cả nhà GPE !.Đánh chử thì hơi lòng vòng em gửi hình mọi người xem sẽ hiểu ngay .( Lưu ý File đính kèm e demo cho mọi người hiểu chứ File thực tế dử liệu của em khoảng 30.000 dòng ) XIn chân thành cảm ơn !

View attachment 209024
Học VBA ngay đi bạn. Sao cứ dựa vào sự giúp đỡ. Nó Quá đơn giản. Sản Phẩm trí tuệ mà mình tự tạo ra mới gọi là ý nghĩa.
Sao cứ mong sự giúp đỡ. Mà trong khi nó không khó đến mấy.
Tôi chắc Chắn Học VBA trong 1 ngày. Với những tham khảo. Và hiểu biết, bạn sẽ thành công
 
Upvote 0
Học VBA ngay đi bạn. Sao cứ dựa vào sự giúp đỡ. Nó Quá đơn giản. Sản Phẩm trí tuệ mà mình tự tạo ra mới gọi là ý nghĩa.
Học thì lúc nào kiếm cơm?
Người ta viết phần mềm bán, thời gian 24 tiếng chỉ đủ để lắp ghép những cái mình làm được và những cái đi nhờ, sao cho chúng đồng bộ. Rồi còn test trước khi giao hàng nữa. Đơn hàng thì nhiều. Thế thời gian đâu để học VBA? :D

Vấn đề không phải là khó hay dễ mà là thời gian không có. Và năng suất. Bạn nhận 1 đơn đặt hàng. Nếu bạn biết và tự làm hết mất 7 ngày. Thế nếu bạn tự làm 4/7 công việc còn 3/7 nhờ GPE thì sao? Thì bạn mất 4 ngày, và trong 4 ngày đó GPE cũng hoàn thành 3/7 còn lại. Như vậy bạn chỉ mất 4 ngày. Có thể sau 4 ngày nhận tiếp đơn hàng mới, và nói với khách cũ chi thêm tiền bồi dưỡng vì đơn hàng được làm với ưu tiên về thời gian.
 
Lần chỉnh sửa cuối:
Upvote 0
1./ Nếu dữ liệu không quá nhiều, bạn thử code này ạ:
PHP:
Sub Macro1()
    ' . . . . .    '
End Sub
2./ Nếu nhiều cỡ dưới vạn thì nên đưa vô mảng vùng dữ liệu nguồn & duyệt
3./ Nếu trên vạn thì kết quả trong quá trình duyệt bỡi (2) nên đưa vô mảng khác (làm mảng thành tựu)

Nam mô a di Đà Lạt!
 
Upvote 0
-> @minhtuan55
Nếu đổi :
a thành Tài / Chẵn
b thành Xỉu / Lẻ

Dữ liệu hàng ngàn thì chỉ có thể là dữ liệu kết quả xổ của một trò chơi ( Không dám đoán trờ chơi gì )
Và bạn cần tính tần xuất xuất hiện của nó.
Nếu là một trờ chơi Ăn thua thì lời khuyên của tôi là nên từ bỏ
Nếu tôi có đoán sai thì cho tôi xin lỗi nhé.


Học thì lúc nào kiếm cơm?
Người ta viết phần mềm bán, thời gian 24 tiếng chỉ đủ để lắp ghép những cái mình làm được và những cái đi nhờ, sao cho chúng đồng bộ. Rồi còn test trước khi giao hàng nữa. Đơn hàng thì nhiều. Thế thời gian đâu để học VBA? :D
Vấn đề không phải là khó hay dễ mà là thời gian không có. Và năng suất. Bạn nhận 1 đơn đặt hàng. Nếu bạn biết và tự làm hết mất 7 ngày. Thế nếu bạn tự làm 4/7 công việc còn 3/7 nhờ GPE thì sao? Thì bạn mất 4 ngày, và trong 4 ngày đó GPE cũng hoàn thành 3/7 còn lại. Như vậy bạn chỉ mất 4 ngày. Có thể sau 4 ngày nhận tiếp đơn hàng mới, và nói với khách cũ chi thêm tiền bồi dưỡng vì đơn hàng được làm với ưu tiên về thời gian.
Thầy cứ nói "thời gian đâu mà học". Có khi người ta lại có nhiều thời gian ăn chơi.
Nếu là không học thì lần hỏi nào may mắn mới gặp được người đưa ra bài giải tối ưu nhất.
Mỗi lần hỏi thì cơ hội có được bài giải tối ưu là quá ít. Thì người hỏi sẽ nằm ở thế trong trờ "đào được vàng" bằng tay ( không học ).
Nếu có học thì vừa tích lũy được kinh nghiệm về tốc độ , cách giải, độ phức tạp, thuật toán ,.. của một bài toán. Kết hợp việc học và việc hỏi
thì sẽ là dùng cổ máy để "đào vàng".
"Học thì lúc nào kiếm cơm?"
Em thấy vừa đúng mà vừa không đúng.
Cho rằng bây giờ học là đã muộn. Nhưng Học thì làm "Quan" <> "Nông dân"
 
Upvote 0
2./ Nếu nhiều cỡ dưới vạn thì nên đưa vô mảng vùng dữ liệu nguồn & duyệt
3./ Nếu trên vạn thì kết quả trong quá trình duyệt bỡi (2) nên đưa vô mảng khác (làm mảng thành tựu)

Nam mô a di Đà Lạt!
Cảm ơn bác @SA_DQ đã chỉ dẫn thêm cho cháu cách sử dụng mảng.
Dạ vâng, nếu dữ liệu nhiều thì chuyển function của bác thành sub ạ:

Mã:
Sub LKDong2()
 Dim Arr()
 Dim J As Long, W As Long
 Dim lastRow As Long, txtFind As Variant
 lastRow = Cells(Rows.Count, "b").End(xlUp).Row
 Arr() = Range("b3:b" & lastRow).Value
 txtFind = Range("e3").Value
 ReDim dArr(1 To UBound(Arr()), 1 To 1) As Variant
 For J = 1 To UBound(Arr())
    If UCase$(Arr(J, 1)) = UCase$(txtFind) Then
        W = W + 1
        dArr(W, 1) = CStr(J) + 2 'Xuất phát từ dòng 3 nên +2
    End If
 Next J
 Range("h3").Resize(UBound(dArr())) = dArr()
End Sub
 
Upvote 0
Học thì lúc nào kiếm cơm?
Người ta viết phần mềm bán, thời gian 24 tiếng chỉ đủ để lắp ghép những cái mình làm được và những cái đi nhờ, sao cho chúng đồng bộ. Rồi còn test trước khi giao hàng nữa. Đơn hàng thì nhiều. Thế thời gian đâu để học VBA? :D

Vấn đề không phải là khó hay dễ mà là thời gian không có. Và năng suất. Bạn nhận 1 đơn đặt hàng. Nếu bạn biết và tự làm hết mất 7 ngày. Thế nếu bạn tự làm 4/7 công việc còn 3/7 nhờ GPE thì sao? Thì bạn mất 4 ngày, và trong 4 ngày đó GPE cũng hoàn thành 3/7 còn lại. Như vậy bạn chỉ mất 4 ngày. Có thể sau 4 ngày nhận tiếp đơn hàng mới, và nói với khách cũ chi thêm tiền bồi dưỡng vì đơn hàng được làm với ưu tiên về thời gian.

Thật ra mình viết thì những cái trên diễn đàn này không thể nào làm 1 ngày 1 bửa là xong. Ví dụ như hệ thống phần Khách sạn tự động kết nối PLC với phần mềm. Khi khách vào check in thì phóng đó có điện....Do mình chuyên bên Phần cứng PLC và lập trình C++ . nên mọi người thông cảm về trình độ VBA cho mình. Mình xin chân thành cảm ơn những ai đã giúp mình. Mình đi chùa mình luôn cầu chúc cho những ai giúp mình. Nếu ai đang đi xe máy thì sẽ có 1 ngày lên cơn Mada 6 như Mình. Mình thật tâm cảm ơn. Đặc biệt các bác Lão làng: Ndu, Vetmini, Quangha,Hai lúa miền tây, Hesanbi,Kieumanh...xin cảm ơn chân thành cả nhà GPE, Chúc cả nhà 1 ngày Sunday vui vẽ
Bài đã được tự động gộp:

-> @minhtuan55
Nếu đổi :
a thành Tài / Chẵn
b thành Xỉu / Lẻ

Dữ liệu hàng ngàn thì chỉ có thể là dữ liệu kết quả xổ của một trò chơi ( Không dám đoán trờ chơi gì )
Và bạn cần tính tần xuất xuất hiện của nó.
Nếu là một trờ chơi Ăn thua thì lời khuyên của tôi là nên từ bỏ
Nếu tôi có đoán sai thì cho tôi xin lỗi nhé.



Thầy cứ nói "thời gian đâu mà học". Có khi người ta lại có nhiều thời gian ăn chơi.
Nếu là không học thì lần hỏi nào may mắn mới gặp được người đưa ra bài giải tối ưu nhất.
Mỗi lần hỏi thì cơ hội có được bài giải tối ưu là quá ít. Thì người hỏi sẽ nằm ở thế trong trờ "đào được vàng" bằng tay ( không học ).
Nếu có học thì vừa tích lũy được kinh nghiệm về tốc độ , cách giải, độ phức tạp, thuật toán ,.. của một bài toán. Kết hợp việc học và việc hỏi
thì sẽ là dùng cổ máy để "đào vàng".
"Học thì lúc nào kiếm cơm?"
Em thấy vừa đúng mà vừa không đúng.
Cho rằng bây giờ học là đã muộn. Nhưng Học thì làm "Quan" <> "Nông dân"

cảm ơn bác đã giúp. bác đoán sai rồi. Mình ứng dụng cho việt Lành mạnh. Việt lành mạnh của mình VÔ cùng phức tạp nên không thể giải thích cho bạn hiểu. Bạn cho mình sdt để mình mời 1 kèo Massge được không. Nhà mình ở Phú Nhuận
 
Upvote 0
Cảm ơn bác @SA_DQ đã chỉ dẫn thêm cho cháu cách sử dụng mảng.
Dạ vâng, nếu dữ liệu nhiều thì chuyển function của bác thành sub ạ:

Mã:
Sub LKDong2()
Dim Arr()
Dim J As Long, W As Long
Dim lastRow As Long, txtFind As Variant
lastRow = Cells(Rows.Count, "b").End(xlUp).Row
Arr() = Range("b3:b" & lastRow).Value
txtFind = Range("e3").Value
ReDim dArr(1 To UBound(Arr()), 1 To 1) As Variant
For J = 1 To UBound(Arr())
    If UCase$(Arr(J, 1)) = UCase$(txtFind) Then
        W = W + 1
        dArr(W, 1) = CStr(J) + 2 'Xuất phát từ dòng 3 nên +2
    End If
Next J
Range("h3").Resize(UBound(dArr())) = dArr()
End Sub
UCase$ Cách viết này thật là khó ưa.
UCase là xử lý chuỗi rồi. Sao phải "làm giàu cho nó vậy" . Có gì lợi hại chăng @Nguyễn Hoàng Oanh Thơ
 
Upvote 0
UCase$ Cách viết này thật là khó ưa.
UCase là xử lý chuỗi rồi. Sao phải "làm giàu cho nó vậy" . Có gì lợi hại chăng @Nguyễn Hoàng Oanh Thơ
Hi @HeSanbi,
OT cũng chưa tìm hiểu về sự khác nhau này nên OT cũng chưa biết nữa. Ở bài #2 OT chỉ dùng UCase. OT thấy các bậc cao thủ tiền bối sử dụng nên nghĩ rằng có thể nó có cái gì đó khác và tối ưu hơn nên OT dùng theo ạ :D.
HeSanbi có thể chỉ dẫn giúp OT 2 cách viết này có gì khác nhau được không ạ?
 
Upvote 0
Oanh Thơ google thì mấy bạn Tây cho biết thế này ạ:
UCase() and UCase$()
The UCase() function returns its string argument in all uppercase letters and returns a variant. It takes a variant and returns the same thereby slowing VB. It is okay to use when you are dealing with variants only. Mainly when you work in databases, where you use many null values, UCase() is good to use.

The UCase$() on the other hand returns the value in string and eliminates the condition of slowing down in VB. This is just the way VB handles its strings.​
Có thể nó có ảnh hưởng gì đó về tốc độ: UCase$ nhanh hơn UCase.
 
Upvote 0
Hi @HeSanbi,
OT cũng chưa tìm hiểu về sự khác nhau này nên OT cũng chưa biết nữa. Ở bài #2 OT chỉ dùng UCase. OT thấy các bậc cao thủ tiền bối sử dụng nên nghĩ rằng có thể nó có cái gì đó khác và tối ưu hơn nên OT dùng theo ạ :D.
HeSanbi có thể chỉ dẫn giúp OT 2 cách viết này có gì khác nhau được không ạ?

PHP:
$ : String
% : Integer (Int16)
& : Long (Int32)
! : Single
# : Double
@ : Decimal
&H : Hex
&O : Octal

Nếu là UCase mình sẽ hỏi nó trả về cái gì vậy
Nếu là UCase$, UCase$ là một function VBA, khi viết như vậy thì mình biết chắc chắn giá trị trả về là chuỗi.
Ví dụ:
Dim a As String
Xuống Dòng 500
a = 1 ( Đố bạn biết tui trả về cái gì )
a$ = 1 ( Tui là đại diện String nè )
Dim i& , str$ , ... Đây là cách viết ngắn gọn cho một biến
Bài đã được tự động gộp:

Oanh Thơ google thì mấy bạn Tây cho biết thế này ạ:

Có thể nó có ảnh hưởng gì đó về tốc độ: UCase$ nhanh hơn UCase.
UCase$ ra đời sau được cải tiến, điều đó là hiển nhiên
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
$ : String
% : Integer (Int16)
& : Long (Int32)
! : Single
# : Double
@ : Decimal
&H : Hex
&O : Octal

Nếu là UCase mình sẽ hỏi nó trả về cái gì vậy
Nếu là UCase$, UCase$ là một function VBA, khi viết như vậy thì mình biết chắc chắn giá trị trả về là chuỗi.
Ví dụ:
Dim a As String
Xuống Dòng 500
a = 1 ( Đố bạn biết tui trả về cái gì )
a$ = 1 ( Tui là đại diện String nè )
Dim i& , str$ , ... Đây là cách viết ngắn gọn cho một biến

OT hiểu nôm na đó là một cách viết thu gọn từ phạm vi tìmkiếm rộng(Variant) về phạm vi hẹp hơn(String) vì UCase chỉ áp dụng đối với String , có phải vậy không @HeSanbi? :D
 
Upvote 0
Web KT

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

Back
Top Bottom