Tìm max hàng (1 người xem)

  • Thread starter Thread starter QQV586
  • Ngày gửi Ngày gửi
Liên hệ QC

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

QQV586

Thành viên chính thức
Tham gia
28/2/13
Bài viết
75
Được thích
1
Em có bài toán này nhờ các bác viết code VBA tìm giúp. Tính max các ô trống theo hàng so sánh lấy giá trị max từ trên xuống hoặc theo thứ tự như file ví dụ em gửi lên.
 

File đính kèm

Tôi thấy càng ngày GPE càng có nhiều câu hỏi không rõ ràng. Đọc xong chả biết người hỏi muốn hỏi gì. Nếu muốn biết thì phải đi hỏi lại. Riêng phần hỏi để biết người hỏi hỏi cái gì cũng cần phải mất cả chục bài.

Chẵng lẽ mình càng ngày càng ngu...
 
Upvote 0
Em để ý thấy anh nào viết code giỏi thì ngôn ngữ diễn đạt cũng đơn giản , dễ hiểu
 
Upvote 0
ah ý bạn là thế này đúng không?
 

File đính kèm

Upvote 0
bạn ấy muốn tìm số cell trống (đứng trước số 1) nhiều nhất
hàng thứ nhất kết quả là 3
hàng thứ 2 kết quả là 5
hàng thứ 3 kết quả là 6
hàng thứ tư kết quả là 5
mã của nguyen đám này là 6
 
Upvote 0
đúng rồi bác. Nhưng hàng nào để hàng đó nha. thanks bác hiểu em nói không hết ý được.
 
Upvote 0
bạn ấy muốn tìm số cell trống (đứng trước số 1) nhiều nhất
hàng thứ nhất kết quả là 3
hàng thứ 2 kết quả là 5
hàng thứ 3 kết quả là 6
hàng thứ tư kết quả là 5
mã của nguyen đám này là 6

Test thử code này xem ntn ?
[GPECODE=vb]
Public Function XLBANKS(Source As Range) As Long
Dim rng As Range, Cells As Range, Count As Long
Set rng = Source.SpecialCells(4)
For Each Cells In rng.Areas
Count = Cells.Columns.Count
If Count > XLBANKS Then XLBANKS = Count
Next
End Function
Sub ktr()
MsgBox XLBANKS([C6:AA6])
End Sub
[/GPECODE]
 
Upvote 0
bác coi kỹ ví dụ và viết code cho ra y như vậy mà, em test code chạy nó báo sao ấy(hiện số liên tục). thanks bác
 
Upvote 0
bác coi kỹ ví dụ và viết code cho ra y như vậy mà, em test code chạy nó báo sao ấy(hiện số liên tục). thanks bác

[GPECODE=vb]
Public Function XLBANKS(Source As Range) As Long
Dim rng As Range, Cells As Range, Count As Long
Set rng = Source.SpecialCells(4)
For Each Cells In rng.Areas
Count = Cells.Columns.Count
If Count > XLBANKS Then XLBANKS = Count
Next
End Function
[/GPECODE]

Mình nói là test code trong môi trường VBA ( cụ thể là sub Ktr()) , còn nếu bạn muốn dùng như một hàm tự tạo User Define thì 1 sự thật phũ phàng là kết quả chắc chắn sẽ không đúng và không chính xác!
Mình nhận thấy Khi sử dụng SpecialCells nên viết dưới dạng Marco ---> Vì Marco sẽ giống như " cặp mắt " của ta: ta nhìn thấy gì thì specialCells cũng thấy như thế
Còn nếu viết dưới dạng hàm người dùng thì phải cẩn thận, vì những gì ta thấy thì chưa chắc speciallCells đã thấy hay những gì ta không thấy thì speciallCells lại thấy __--__

ví dụ :[GPECODE=vb]
Public Function Test(Rng As Range)
On Error Resume Next
Test = Rng.SpecialCells(xlCellTypeVisible).Cells.Count
End Function
Sub Tset()
On Error Resume Next
[D4] = Rng.SpecialCells(xlCellTypeVisible).Cells.Count
End Sub
[/GPECODE]
Tại ô D4 bạn gõ công thức Test kết quả sẽ khác với khi bạn chạy sub tset()

Good luck ,!--=----=----=--
PS : bạn có thể dùng code này để tìm max các ô trống
[GPECODE=vb]
Function XLBANKS(Rng As Range) As Long
Dim tmparr, Item
Dim n As Long
tmparr = Rng.Value
For Each Item In tmparr
If Len(Item) Then
If n > XLBANKS Then XLBANKS = n
n = 0
Else
n = n + 1
End If
Next
End Function
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Thanks bác em. em biết nhiều hơn chút.
 
Upvote 0
tiện đây các bác cho em hỏi về bài này về trường hợp Max hàng nhưng khác giá trị ô là khác(xen lẫn giữa 1 và 0) chỉ tìm khoảng trống max giữa 1 đến 0. Code chạy cho bài này ra ntn các bác? file bài ví dụ đây. thanks mọi người GPE.
 

File đính kèm

Upvote 0
tiện đây các bác cho em hỏi về bài này về trường hợp Max hàng nhưng khác giá trị ô là khác(xen lẫn giữa 1 và 0) chỉ tìm khoảng trống max giữa 1 đến 0. Code chạy cho bài này ra ntn các bác? file bài ví dụ đây. thanks mọi người GPE.

Tôi nghĩ code tôi gửi ở bài #11 vẫn có thể áp dụng được, bạn tự nghiên cứu và tuỳ biến nhé !
 
Upvote 0
nếu em biết đã chẳng đưa lên, hai nữa em mới biết tới code đã ra đâu vào đâu mà bác. Bài toán có thêm yêu cầu tính số ô liền kề cuối cùng và ô liền kề tính từ 1 ra, không tính từ 0(có thể bỏ qua)
Cảm ơn mọi người quan tâm và giúp đỡ!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
các bác xem cho em ý kiến cái nhỉ? và code để giải bài này ra sao? thanks các bác.
 
Upvote 0
a/e forum GPE vào coi kỹ cho mình trả lời cho mình với. Bài post khá lâu không thấy ai nói gì là sao???
Bài toán tính max từ 1 đến 0 trong hàng(nếu trường có 1 đến 1 là lớn nhất thuộc hàng có thể đem ra so sánh, lưu ý không đem max của ô tính từ 1 ra ô cuối cùng so sánh các max khác vì ô cuối chưa xác định là 1 hay 0 ) còn không tính max từ 0 đến 0. Sau đó tính ô trống liên tiếp cuối cùng.
Cảm ơn những ai đã quan tâm cho ý kiến đóng góp!
 
Lần chỉnh sửa cuối:
Upvote 0
em tìm cái code nhờ các bác thay đổi giúp em. Tính ô liên tiếp cuối cùng từ 1. bỏ tính từ 0 ô liên tiếp cuối cùng đi. code đây các bác coi qua giúp(trong code tính cả ô liên tiếp cuối cùng từ 0)
Option Explicit




Public Sub DemDem()
Dim Re, ReTim, Gom, Vung, I, J, Mg, Kq, Cll
Set Re = CreateObject("vbscript.regexp")
Vung = Range("J3:AB10").Value
ReDim Mg(1 To UBound(Vung), 1 To 3)
With Re
For I = 1 To UBound(Vung, 1)
For J = 1 To UBound(Vung, 2)
If Vung(I, J) = "" Then
Gom = Gom & " "
Else
Gom = Gom & Vung(I, J)
End If
Next J
.Global = True
.Pattern = "1\s+0"
Set ReTim = .Execute(Gom)
For Each Cll In ReTim
Kq = IIf(Kq > Cll.Length, Kq, Cll.Length)
Next Cll
Mg(I, 1) = Kq - 2
Kq = 0
.Pattern = "0\s+1"
Set ReTim = .Execute(Gom)
For Each Cll In ReTim
Kq = IIf(Kq > Cll.Length, Kq, Cll.Length)
Next Cll
Mg(I, 2) = Kq - 2
Kq = 0
.Pattern = "[0-9]\s+$"
Set ReTim = .Execute(Gom)
If ReTim.Count = 0 Then
Mg(I, 3) = 0
Else
Mg(I, 3) = ReTim.Item(0).Length - 1
End If
Gom = ""
Next I
End With
[AF3].Resize(UBound(Vung), 3) = Mg
End Sub

thanks các bác nha!
 
Upvote 0
Bạn nhờ thì mình làm cho bạn vui thôi, chứ thật ra chưa hiểu hết, nên làm có thể ..........trật lấc. Hihihi
Mà cái bài này là làm cái quái gì mà cứ tìm "Mắt mắt mũi mũi" hoài "zị" Híc
Thân
 

File đính kèm

Upvote 0
dù sao cũng cảm ơn bác!
Thanks GPE!
 
Upvote 0
bác ah! em chạy rồi rất ok. nhưng có điều lạ là có nhiều chỗ báo giá trị âm. và khi chạy khoảng 61250R*1500C là mất khoang 30 phút. rất vất vả bác xem có cách nào đẩy nhanh tiến độ được không. và giá trị âm là sao?
Thanks bác nhiều!!!
Thanks GPE!!!
 
Upvote 0
bác ah! em chạy rồi rất ok. nhưng có điều lạ là có nhiều chỗ báo giá trị âm. và khi chạy khoảng 61250R*1500C là mất khoang 30 phút. rất vất vả bác xem có cách nào đẩy nhanh tiến độ được không. và giá trị âm là sao?
Thanks bác nhiều!!!
Thanks GPE!!!
1- Bạn đưa file có kết quả âm cho mình xem thử lý do ở đâu
2- Với số lượng hàng & cột khủng như thế thì mình chưa thử bao giờ nên chưa nghĩ ra được phương án nào, bạn đưa thử khoảng 1000 hàng & 1500 cột để viết cách khác xem sao
Thân
 
Upvote 0
aloha bác concogia ơi! quá trình có lỗi báo 1004 chỉ ra ở chỗ này Mg(kK, 1) = Vung(I, 1): Mg(kK, 2) = Vung(J, 1) bác xem và chỉnh sao giúp em với. Như em đã báo có với bác rồi chạy lơn là báo lỗi đó hết. bác xem cho em những góp ý cụ thể.
thanks bác
 
Upvote 0
bác ah! em chạy rồi rất ok. nhưng có điều lạ là có nhiều chỗ báo giá trị âm. và khi chạy khoảng 61250R*1500C là mất khoang 30 phút. rất vất vả bác xem có cách nào đẩy nhanh tiến độ được không. và giá trị âm là sao?
Thanks bác nhiều!!!
Thanks GPE!!!

Mã:
Set ReTim = Re.Execute(Cll)
For Each iTim In ReTim
    iMax = IIf(iTim.Length > iMax, iTim.Length, iMax)
Next
Mg(I, 1) = [B][COLOR=#ff0000]iMax - 2[/COLOR][/B]: iMax = 0

Sai ở chỗ đỏ đỏ. Vì nếu không tìm thấy, vd. dòng toàn 0, thì vòng FOR không được thực hiện, iMax = 0. Lúc đó thì iMax - 2 = -2 (âm)
--------
Ngoài ra code không hợp lý.
Mã:
For I = 1 To UBound(Vung)
            For J = 1 To UBound(Vung, 2)
                ...
            Next J
            With Re
                [B][COLOR=#ff0000].Global = True
                    .IgnoreCase = True[/COLOR][/B]
                ...
            End With
            ...
Next I

Vì nếu có 10000 dòng dữ liệu thì chả nhẽ thực hiện chỗ đỏ đỏ 10000 lần?
Bỏ chỗ đỏ đỏ ra ngoài 2 vòng FOR. Tức vd. sau Set Re = CreateObject("vbscript.regexp")
-----------
Với 61250 dòng, 1500 cột thì Vung là mảng có 91875000 ô. Mỗi ô là 16 bai, vậy chỉ riêng cái mảng Vung đã chiếm 1470000000 bai trong RAM, tức gần 1,5 GB RAM. Mảng hơi bị khủng đó bạn.
 
Upvote 0
Qua số lượng chạy được như vậy nên thấy sai. dành nhờ các bác cao thủ chỉnh cho phù hợp với mọi trường hợp lớn nhỏ. Thanks bác!
Thanks GPE!
 
Upvote 0

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

Back
Top Bottom