Sửa lỗi Runtime error "6" Over flow (1 người xem)

Liên hệ QC

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

vanle33

Thành viên gạo cội
Tham gia
30/10/08
Bài viết
5,962
Được thích
4,009
Giới tính
Nam
Tôi có file Nhật ký này nhưng khi nhấn Cap Nhat thì bị lỗi Runtime error "6" Over Flow. Mong các thành viên trợ giúp sửa lỗi trên cho tôi.

Do tôi không phải chủ nhân của file này nên không có pass VBA mà phải dùng Remove VBA ... của bác siwtom.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn giaiphap và langtuchungtinh360 : Đây là code trong sheet Nhatky
Dim TGmin As Double
Dim TGmax As Double
Dim Itg As Double


Public Sub HamDuyet()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim h As Integer
Dim g As Integer
For i = 15 To 400
Sheet4.Cells(i, 1).Value = ""
Sheet4.Cells(i, 2).Value = ""
Sheet4.Cells(i, 3).Value = ""
Sheet4.Cells(i, 4).Value = ""
Next i

TGmin = Sheet5.Cells(5, 6).Value
TGmax = Sheet5.Cells(6, 6).Value
Itg = TGmin
k = 14
g = 1
Do While Itg <= TGmax
i = 15
Sheet4.Cells(k, 1).Value = g
Sheet4.Cells(k, 2).Value = Itg
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
j = 0
h = 0
Do While Sheet1.Cells(i, 1).Text <> "ket thuc"
' Phan nghiem thu
If Sheet1.Cells(i, 11).Value = Itg Then
Sheet4.Cells(k + j, 3).Value = Sheet1.Cells(i, 2).Value
Sheet4.Cells(k + j, 4).Value = "Nghiêm thu " + Sheet1.Cells(i, 3).Value
j = j + 1
h = 1
End If
'Phan thi cong
If (Sheet1.Cells(i, 6).Value <= Itg) And (Sheet1.Cells(i, 7).Value >= Itg) Then
Sheet4.Cells(k + j, 3).Value = Sheet1.Cells(i, 2).Value
Sheet4.Cells(k + j, 4).Value = "Thi công " + Sheet1.Cells(i, 3).Value
j = j + 1
h = 1
End If
i = i + 1
Loop
If h = 1 Then
j = j - 1
End If
Itg = Itg + 1
k = k + j + 1
g = g + 1
Loop
End Sub


Private Sub CapNhatNK_Click()
HamDuyet
End Sub
 
Upvote 0
Tôi có file Nhật ký này nhưng khi nhấn Cap Nhat thì bị lỗi Runtime error "6" Over Flow. Mong các thành viên trợ giúp sửa lỗi trên cho tôi.

Do tôi không phải chủ nhân của file này nên không có pass VBA mà phải dùng Remove VBA ... của bác siwtom.
Tại ô A102 ở sheet 01-Danh Muc sửa chữ "Kết thúc" thành "ket thuc" như trong code là được. Không thì anh sửa code theo ô A102.
 
Upvote 0
Tại ô A102 ở sheet 01-Danh Muc sửa chữ "Kết thúc" thành "ket thuc" như trong code là được. Không thì anh sửa code theo ô A102.
Chuẩn là chữ "ket thuc" đó bạn. Do mình tự sửa thành "Kết thúc" hiii
Mà sao ngày Kết thúc thi công công việc số 7 là 16/06/2015 mà bên Nhật ký chỉ chạy ra đến ngày 10/06/2015 bạn nhỉ?
 
Upvote 0
Chuẩn là chữ "ket thuc" đó bạn. Do mình tự sửa thành "Kết thúc" hiii
Mà sao ngày Kết thúc thi công công việc số 7 là 16/06/2015 mà bên Nhật ký chỉ chạy ra đến ngày 10/06/2015 bạn nhỉ?
em nghĩ chỗ này
Mã:
[COLOR=#000000]For i = 15 To 400[/COLOR]
[COLOR=#000000]Sheet4.Cells(i, 1).Value = ""[/COLOR]
[COLOR=#000000]Sheet4.Cells(i, 2).Value = ""[/COLOR]
[COLOR=#000000]Sheet4.Cells(i, 3).Value = ""[/COLOR]
[COLOR=#000000]Sheet4.Cells(i, 4).Value = ""[/COLOR]
[COLOR=#000000]Next i
[/COLOR]

thay bằng
Mã:
Sheet4.Range(Cells(15,1),Cells(400,4)).value=""
thì có lẽ nó sẽ nhanh hơn là duyệt qua 385x4 ô nhỉ
----------------------
rồi mấy chữ trong ngoặc kép "xxx" thì em nghĩ nếu trong biên bản có chữ đó thì cho nó bằng với value tại cells đó thì có lẽ chính xác hơn, cho dù biên bản có sửa đổi thì cũng không sai
 
Lần chỉnh sửa cuối:
Upvote 0
em nghĩ chỗ này
Mã:
Sheet4.Range(Cells(15,1),Cells(400,4)).value=""

Hình như là thế này: Sheet4.[A15:D400].Value=""
Mà sao ngày Kết thúc thi công công việc số 7 là 16/06/2015 mà bên Nhật ký chỉ chạy ra đến ngày 10/06/2015 bạn nhỉ?
Nhìn hông có hiểu nên hông có biết sửa sao luôn anh. Nếu tiện thì anh chỉ rõ nhật ký nó chạy ra nằm dòng nào. (Dòng 55 phải hông nhỉ?)
 
Lần chỉnh sửa cuối:
Upvote 0

Hình như là thế này: Sheet4.[A15:D400].Value=""

Nhìn hông có hiểu nên hông có biết sửa sao luôn anh. Nếu tiện thì anh chỉ rõ nhật ký nó chạy ra nằm dòng nào. (Dòng 55 phải hông nhỉ?)
thì tác giả muốn dùng cells thì em dùng cells thôi mà bác cũng bắt lỗi.
không lẽ em ghi vậy rồi mà em không biết nó là vùng A15:D400&&&%$R
 
Upvote 0
thì tác giả muốn dùng cells thì em dùng cells thôi mà bác cũng bắt lỗi.
không lẽ em ghi vậy rồi mà em không biết nó là vùng A15:D400&&&%$R
Mã:
Sheet4.[COLOR=#ff0000]Range[/COLOR](Cells(15,1),Cells(400,4)).value=""
Hehe. Thấy range rõ ràng cơ mà nên mới thò vô chứ./-*+/
P/s: Có câu nào nói là bạn hông biết đâu.
 
Upvote 0
Hehe. Thấy range rõ ràng cơ mà nên mới thò vô chứ./-*+/
P/s: Có câu nào nói là bạn hông biết đâu.
thì em nghĩ là chắc nghĩ em không biết.
do em không biết căn bản nên có thể ghi sai
vậy Sheet4.Range(Cells(15,1),Cells(400,4)).value=""
phải ghi thế nào để bỏ chữ Range đi luôn bác. ngoài vụ [ ] này
vì em có đọc ở đây
Mã:
[COLOR=#000000]Ngoài ra khi tham chiếu đến ô [/COLOR][B][COLOR=blue]A1[/COLOR], các bạn có thể dùng code
Cách 1:Code:
Range("A1")
hoặc 
Cách 2:Code:
[A1]
Trong hai cách ở trên, cách 2 ngắn gọn hơn nhưng sẽ chậm hơn cách 1.
nguồn [/B]http://www.giaiphapexcel.com/forum/showthread.php?21361-Tăng-tốc-cho-code-VBA-của-bạn
như thế ghi [] thì code sẽ chậm
 
Upvote 0
tôi nói là bạn không biết nó là vùng A15:D400 đấy , có ý kiến mời vào đây giao lưu

Mã:
Sub code()
Range(Cells(15, 1), Cells(400, 4)).Value = 8888
End Sub
nó ghi 8888 từ A15:D400 đấy thôi bác.
----------------------------------------
topic người ta vào chém gió hoài. chắc bị đình chỉ hoạt động quá
 
Upvote 0
Mã:
Sub code()
Range(Cells(15, 1), Cells(400, 4)).Value = 8888
End Sub
nó ghi 8888 từ A15:D400 đấy thôi bác.
----------------------------------------
topic người ta vào chém gió hoài. chắc bị đình chỉ hoạt động quá
cách viết này với cách viết trước của bạn đã thay đổi rồi
sao bạn không dám ghi là
Sheet4.Range(Cells(15, 1), Cells(400, 4)).Value = 8888
nữa ta ?
 
Upvote 0
Hí hí, Kể từ hồi viết VBA tới giờ Ít bao giờ (có thể chưa bao giờ) mình viết kiểu vầy

Mã:
 [COLOR=#000000][COLOR=#000000][I]Sheet4.[/I][/COLOR][/COLOR][COLOR=#ff0000][B][I]Range[/I][/B][COLOR=#000000][I][B](Cells(15,1),Cells(400,4)[/B][/I][/COLOR][/COLOR][COLOR=#000000][COLOR=#000000][I]).value="" [/I][/COLOR][/COLOR]
Cứ toàn là Range("Ax:Dx") hoặc [Ax:Dx]
Mình lạc hậu quá chăng....
chắc là có mình em viết vậy quá.
à. đúng là code trên sai thật, mới nhìn ra
Mã:
 [COLOR=#000000][COLOR=#000000][I]Sheet4.[/I][/COLOR][/COLOR][COLOR=#ff0000][B][I]Range[/I][/B][COLOR=#000000][I][B]([/B][/I][/COLOR][/COLOR][I]Sheet4.[/I][COLOR=#ff0000][COLOR=#000000][I][B]Cells(15,1),[/B][/I][/COLOR][/COLOR][I]Sheet4.[/I][COLOR=#ff0000][COLOR=#000000][I][B]Cells(400,4)[/B][/I][/COLOR][/COLOR][COLOR=#000000][COLOR=#000000][I]).value="" [/I][/COLOR][/COLOR]
thì nó mới làm việc trên sheet4 được.
có thể có nhiều cách chọn vùng khác mà em chưa biết chăng
ghi [xxxxx] em đọc được thì nghe là code sẽ chạy chậm nên hạn chế dùng.
còn ghi Ax:Dy thì cũng được. nhưng em đang tập làm quen R1C1 nên chơi vậy.
 
Upvote 0
cách viết này với cách viết trước của bạn đã thay đổi rồi
sao bạn không dám ghi là
Sheet4.Range(Cells(15, 1), Cells(400, 4)).Value = 8888
nữa ta ?
tại code trên là dùng cho sheet4 mà bác. câu trên em sửa lại rồi.
cứ thích bắt lỗi mấy con gà như em
(@$%@
 
Upvote 0
...
như thế ghi [] thì code sẽ chậm

[] là ký hiệu viết tắt của hàm Evaluate. Mõi lần gặp [] thì VBA phải gọi hàm Evaluate ra để tính cái bên trong nó và trả về range. Vì vậy nó hơi chậm hơn chiếu thẳng vào thuộc tính Range. Tuy nhiên, cái chậm đó rất nhỏ, chả đáng phải lo. Điểm quan trọng là [] chỉ hoạt động với hằng số (bên trong nó phải là hằng số). Cho nên sử dụng nó thì code được gọi là code cứng.
 
Upvote 0


Nhìn hông có hiểu nên hông có biết sửa sao luôn anh. Nếu tiện thì anh chỉ rõ nhật ký nó chạy ra nằm dòng nào. (Dòng 55 phải hông nhỉ?)
Tôi thấy nguyên tắc của viết Nhật ký từ sheet Danh muc là :
Sheet Danh muc có nội dung công việc nào thì sẽ đều được lọc (tất cả) sang sheet Nhat ky. Nếu nhiều việc trong 1 ngày thì bên sheet Nhat ky có nhiều việc trên ngày. Thời gian thi công từ bắt đầu đến kết thúc thì bên sheet Nhat ky công việc đó sẽ được copy cho nhiều ngày từ ngày bắt đầu đến ngày kết thúc.
Ngày nghiệm thu sẽ là sự kết hợp giữa cột H và cột I và cột K. Ví dụ : 17/05/2015 : 14h30 - 17h30 Nghiệm thu công việc "Xây móng đá hộc VXM M50#"
Ngày yêu cầu là cột J : 15/06/2015 : Yêu cầu nghiệm thu "Xây móng đá hộc VXM M50#"

p/s: Ngày 17/05 ở trên đang sai quy trình --=0 do đây chỉ là ví dụ ngày chính xác phải là 17/06
 
Upvote 0
Code trên quá sức rườm rà, mà chả có 1 lời chú cho nên không thể đọc nổi.

Chỉ có thể mách cho bạn 2 điểm trầm tọng của code:

1. vòng lặp ngoài duyệt theo trị double (ITg) nhưng bên trong vòng lặp có con số đếm dùng trị integer (g). Vì vậy chuyện overflow rất dễ xảy ra

2. vòng lặp trong dựa vào giá trị ở một ô để kết thúc. Mà giá trị ấy lại là text. Sẽ có nhiều trường hợp lỗi, điểm hình là lôi bạn đã gặp.
text chỉ cần hơi trệch 1 chút (có dư 1 dấu cách chẳng hạn) là vòng lặp chạy mút chỉ. May mắn là bên trong vòng lặp có con số đếm i là integer, nó bị bể ổ (overflow) sau khi bạn chạy trên 16000 dòng. Bình thường, người ta dùng một từ gì rất khó nhầm, chẳng hạn "STOP", hoặc "END", và nhớ là phải trim, và ucase nó trước khi so sánh.
 
Upvote 0
Code trên quá sức rườm rà, mà chả có 1 lời chú cho nên không thể đọc nổi.

Chỉ có thể mách cho bạn 2 điểm trầm tọng của code:

1. vòng lặp ngoài duyệt theo trị double (ITg) nhưng bên trong vòng lặp có con số đếm dùng trị integer (g). Vì vậy chuyện overflow rất dễ xảy ra

2. vòng lặp trong dựa vào giá trị ở một ô để kết thúc. Mà giá trị ấy lại là text. Sẽ có nhiều trường hợp lỗi, điểm hình là lôi bạn đã gặp.
text chỉ cần hơi trệch 1 chút (có dư 1 dấu cách chẳng hạn) là vòng lặp chạy mút chỉ. May mắn là bên trong vòng lặp có con số đếm i là integer, nó bị bể ổ (overflow) sau khi bạn chạy trên 16000 dòng. Bình thường, người ta dùng một từ gì rất khó nhầm, chẳng hạn "STOP", hoặc "END", và nhớ là phải trim, và ucase nó trước khi so sánh.
Phải chăng nên thay integer thành long rồi On error resume next và On error go to 0 dò từng đoạn hả bạn VetMini
 
Upvote 0
Phải chăng nên thay integer thành long rồi On error resume next và On error go to 0 dò từng đoạn hả bạn VetMini
Trường hợp này là vòng lặp vô tận do không thỏa điều kiện thoát chứ không phải lỗi. Bẫy lỗi cũng vô dụng.
Khi dùng vòng lặp Do... Loop hoặc While... Wend cần xét điều kiện thoát vòng lặp cho thật chặt chẽ.
 
Upvote 0
Tôi chỉ có thể nêu ra một vài điểm trầm trọng thôi.

Code này viết không có 1 lời chú thích. Làm sao tôi biết được những chỗ sai là do code sai (không đúng với thuật toán) hay thuật toán sai (code đúng thuật toán, nhưng chính thuật toán không đạt yêu cầu) mà sửa?
 
Upvote 0
Code trên quá sức rườm rà, mà chả có 1 lời chú cho nên không thể đọc nổi.

Chỉ có thể mách cho bạn 2 điểm trầm tọng của code:

1. vòng lặp ngoài duyệt theo trị double (ITg) nhưng bên trong vòng lặp có con số đếm dùng trị integer (g). Vì vậy chuyện overflow rất dễ xảy ra

2. vòng lặp trong dựa vào giá trị ở một ô để kết thúc. Mà giá trị ấy lại là text. Sẽ có nhiều trường hợp lỗi, điểm hình là lôi bạn đã gặp.
text chỉ cần hơi trệch 1 chút (có dư 1 dấu cách chẳng hạn) là vòng lặp chạy mút chỉ. May mắn là bên trong vòng lặp có con số đếm i là integer, nó bị bể ổ (overflow) sau khi bạn chạy trên 16000 dòng. Bình thường, người ta dùng một từ gì rất khó nhầm, chẳng hạn "STOP", hoặc "END", và nhớ là phải trim, và ucase nó trước khi so sánh.
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.
 
Upvote 0
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.

Bạn cứ sửa theo 2 điểm đó là cải thiện một phần lớn , cứ làm vậy.
 
Upvote 0
Bạn cứ sửa theo 2 điểm đó là cải thiện một phần lớn , cứ làm vậy.
Có thật là sửa những chỗ đó sẽ cải thiện được tốc độ không? Tôi thì tôi nghĩ những chỗ đó chả liên quan gì đến tốc độ cả.Theo tôi, muốn cải thiện tốc độ thì:1. Không đọc và ghi dữ liệu trực tiếp trên từng ô mà lấy tất cả dữ liệu vào mảng, xử lý trên mảng và ghi dữ liệu xuống sheet 1 lần.2. Thay đổi thuật toán. Thuật toán hiện tại dùng 2 vòng lặp, vòng 1 duyệt qua các ngày, vòng 2 trong vòng 1 duyệt qua tất cả các dòng của dữ liệu. Hơi phí.Lý thuyết là thế nhưng nếu cảm thấy code hiện tại không quá chậm thì cũng không nên đau đầu làm gì.
 
Upvote 0
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.

Đỏ:
Bạn hỏi trật người rồi. Tốc độ không phải là mục đích viết code của tôi. Trong mục này, có lẽ tôi đứng khoảng thứ 100 ở đây.

Xanh:
Tôi có nói rồi. Tôi lười làm việc theo kiểu đoán mò lắm. Code khong có chú thích giải thuật thì tôi chịu thua.
 
Upvote 0
Về code là em mù tịt chuyện sửa chữa.
Bác giúp em chỉnh code để tối ưu tốc độ nhanh nhất, không bị lỗi Over flow với a.
Và bác giải quyết cho em vấn đề em hỏi ở #6 và #20 với a.
lỗi Over flow là do chỗ
<> "Ket thuc"
bác sửa chỗ đó lại thành
= "K" & ChrW(7871) & "t th" & ChrW(250) & "c"
chỗ này
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
liệu có cần như thế không
nếu cần thì tui viết lại cái khác cho (sẽ giúp hết khả năng)
code trên của ai thì bác liên hệ với người đó lại nha. code đó chạy hoàn toàn sai sau khi tui sửa chỗ kết thúc đó lại để thoát vòng lặp
 
Upvote 0
lỗi Over flow là do chỗ
<> "Ket thuc"
bác sửa chỗ đó lại thành
= "K" & ChrW(7871) & "t th" & ChrW(250) & "c"
chỗ này
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
liệu có cần như thế không
nếu cần thì tui viết lại cái khác cho (sẽ giúp hết khả năng)
code trên của ai thì bác liên hệ với người đó lại nha. code đó chạy hoàn toàn sai sau khi tui sửa chỗ kết thúc đó lại để thoát vòng lặp
Vấn đề này hôm qua đã nói tới rồi mà. Thế bạn thử viết lại xem.
 
Upvote 0
Đỏ:
Bạn hỏi trật người rồi. Tốc độ không phải là mục đích viết code của tôi. Trong mục này, có lẽ tôi đứng khoảng thứ 100 ở đây.

Xanh:
Tôi có nói rồi. Tôi lười làm việc theo kiểu đoán mò lắm. Code khong có chú thích giải thuật thì tôi chịu thua.
Nếu em hiểu không nhầm thì em xin giải thích cách làm thôi, chứ code thì làm biếng xem lắm, nhìn chạy hoài phát ngán
tại sheet 05-TTDV sẽ lấy thời gian bắt đầu với kết thúc ra để xét
tại sheet 01-Danh muc
tại cột F nếu ngày lớn hơn bắt đầu thì điền thông tin đó qua 04-Nhat ky
tại cột G nếu nhỏ hơn hoặc bằng ngày kết thúc thì quất qua 04- Nhat ky tiếp
 
Upvote 0
Code này có một số biến toàn cục module

Đây là code trong sheet Nhatky
Dim TGmin As Double
Dim TGmax As Double
Dim Itg As Double


Public Sub HamDuyet()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim h As Integer
Dim g As Integer

Cái phần màu xanh là biến toàn cục. Ít nhất là toàn cục trong local module.

Biến toàn cục được sử dụng khi:
1. có nhiều sub, functions trong cùng module cùng sử dụng trị của biến
2. sub được chạy nhiều lần, và mỗi lần thì dùng kết quả của lần chạy trước.
3. lý do khác

Trước khi biết được lý do, mọi nổ lực sửa code chỉ là làm mò, không khoa học.
 
Upvote 0
1) lỗi Over flow là do chỗ
<> "Ket thuc"
bác sửa chỗ đó lại thành
= "K" & ChrW(7871) & "t th" & ChrW(250) & "c"

2) chỗ này
Sheet4.Cells(k, 4).Value = "Mua Công truong nghi"
liệu có cần như thế không
nếu cần thì tui viết lại cái khác cho (sẽ giúp hết khả năng)
code trên của ai thì bác liên hệ với người đó lại nha. code đó chạy hoàn toàn sai sau khi tui sửa chỗ kết thúc đó lại để thoát vòng lặp
Mong bạn viết lại code cho tôi.
1) Tôi đã nói ở #6
2) Tôi cũng không hiểu tại sao là khi công trường không thi công gì lại xuất kết quả ra là "Mua Công truong nghi" --=0 cho dù bên sheet Danh muc không có ngày nào là Mưa.
 
Upvote 0
Mình đã dịch macro đó sang VBA của mình như sau:

PHP:
Option Explicit
Dim TGmin As Double, TGmax As Double, Itg As Double
Public Sub HamDuyet()
 Dim I As Integer, J As Integer, K As Integer, H As Integer, G As Integer
 
 Sheet4.Range("A15:A400").Resize(, 4).Value = ""
3 TGmin = Sheet5.Cells(5, 6).Value
 TGmax = Sheet5.Cells(6, 6).Value
5 Itg = TGmin
 K = 14:                                    G = 1
7 Do While Itg <= TGmax
    I = 15
9    Sheet4.Cells(K, 1).Value = G
    Sheet4.Cells(K, 2).Value = Itg
11    Sheet4.Cells(K, 4).Value = "Mua Công truong nghi"
    J = 0:                                  H = 0
13    Do While Sheet1.Cells(I, 1).Text <> "ket thuc"
' Phan nghiem thu'
        If Sheet1.Cells(I, 11).Value = Itg Then
15            Sheet4.Cells(K + J, 3).Value = Sheet1.Cells(I, 2).Value
            Sheet4.Cells(K + J, 4).Value = "Nghiêm thu " & Sheet1.Cells(I, 3).Value '<=|'
17            J = J + 1:                      H = 1
        End If
'Phan thi cong'
19        If (Sheet1.Cells(I, 6).Value <= Itg) And (Sheet1.Cells(I, 7).Value >= Itg) Then
            Sheet4.Cells(K + J, 3).Value = Sheet1.Cells(I, 2).Value
21            Sheet4.Cells(K + J, 4).Value = "Thi công " + Sheet1.Cells(I, 3).Value
            J = J + 1:                        H = 1
23        End If
        I = I + 1
25    Loop
    If H = 1 Then J = J - 1
27    Itg = Itg + 1
    K = K + J + 1:                            G = G + 1
29 Loop
End Sub

Thứ nhất:
Tên biến Không nên là 'TGMin' hay 'TGMax' để chỉ ngày/tháng/năm
Mà nên là 'fDat', 'lDat' hay Ngày1 & Ngày2
Để khỏi chuôi vô vòng lặp vô tận, trước dòng lệnh đánh số 5 ta cần thêm câu lệnh để khẳng định fDat <= lDat
(Nếu không đạt điều kiện này,ta fải xài động tác hoán đổi giữa chúng với nhau); Chuyện này đề fòng những kẻ say xỉn vận hành chương trình nhập ngày theo hệ Mĩ thay vì hệ Fáp hoặc ngược lại

Thoát vòng lặp trong, ta nên xài điều kiện khác, chứ xài như trong chương trình của bạn bấp bênh lắm.

Tựu chung là cần biến cái của người khác thành cái của mình, loại trừ thói đỏng đãnh của tác giả & đưa thói đổng đãnh của mình vào!
 
Upvote 0
Mong bạn viết lại code cho tôi.
1) Tôi đã nói ở #6
2) Tôi cũng không hiểu tại sao là khi công trường không thi công gì lại xuất kết quả ra là "Mua Công truong nghi" --=0 cho dù bên sheet Danh muc không có ngày nào là Mưa.
tạm thời bạn dùng cái này xem sao nha
còn 1 vấn đề Mưa! nghỉ này kia thì sao?
Ngày nào không có công việc thì cho mưa hả bạn
------------------
code này chạy sai 1 chỗ là ngày nó không liên tục nha (đó là ở những ngày không có công việc ấy- nó sẽ bỏ qua ngày đó không điền vào)
Mã:
Sub NhatKy()
Application.ScreenUpdating = False
BatDau = Sheet5.Range("F5").Value
KetThuc = Sheet5.Range("F6").Value
c = Sheet1.UsedRange.Rows.Count
j = 14
k = 1
'xoa du lieu
Sheet4.Range("A14:E100").Value = ""
'vong lap ket thuc khi ngay bat dau > ngay ket thuc
Do While BatDau <= KetThuc


For i = 18 To c


BDauau = Sheet1.Cells(i, 6).Value
KThuc = Sheet1.Cells(i, 7).Value


'kiem tra xem cong viec co namg trong khoang thoi gian xxxx khong
If BDauau <= BatDau And KThuc >= BatDau Then





'kiem tra ngay de dien vao
    If KTraNgay <> BatDau Then
        KTraNgay = BatDau
        DienNgay = BatDau
    Else
        DienNgay = ""
    End If
'kiem tra va dien hang muc
    HMucNguon = Sheet1.Cells(i, 2).Value
    If KTraHMuc <> HMucNguon Then
        KTraHMuc = HMucNguon
        DienHangMuc = HMucNguon
    Else
        DienHangMuc = ""
    End If
'kien tra va dien STT
    If DienNgay <> "" Then
    Sheet4.Cells(j, 1) = k
    k = k + 1
    End If



'dien vao sheet Nhat ky
Sheet4.Cells(j, 2) = DienNgay
Sheet4.Cells(j, 3).Value = DienHangMuc 'hang muc
Sheet4.Cells(j, 4).Value = Sheet1.Cells(i, 3).Value 'noi dung cong vc
j = j + 1
End If


Next i
    BatDau = BatDau + 1
Loop
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
tạm thời bạn dùng cái này xem sao nha
còn 1 vấn đề Mưa! nghỉ này kia thì sao?
Ngày nào không có công việc thì cho mưa hả bạn
------------------
code này chạy sai 1 chỗ là ngày nó không liên tục nha (đó là ở những ngày không có công việc ấy- nó sẽ bỏ qua ngày đó không điền vào)
Mã:
Sub NhatKy()
Application.ScreenUpdating = False
BatDau = Sheet5.Range("F5").Value
KetThuc = Sheet5.Range("F6").Value
c = Sheet1.UsedRange.Rows.Count
j = 14
k = 1
'xoa du lieu
Sheet4.Range("A14:E100").Value = ""
'vong lap ket thuc khi ngay bat dau > ngay ket thuc
Do While BatDau <= KetThuc


For i = 18 To c


BDauau = Sheet1.Cells(i, 6).Value
KThuc = Sheet1.Cells(i, 7).Value


'kiem tra xem cong viec co namg trong khoang thoi gian xxxx khong
If BDauau <= BatDau And KThuc >= BatDau Then




'kien tra va dien STT
    If DienNgay <> "" Then
    Sheet4.Cells(j, 1) = k
    k = k + 1
    End If
'kiem tra ngay de dien vao
    If KTraNgay <> BatDau Then
        KTraNgay = BatDau
        DienNgay = BatDau
    Else
        DienNgay = ""
    End If
'kiem tra va dien hang muc
    HMucNguon = Sheet1.Cells(i, 2).Value
    If KTraHMuc <> HMucNguon Then
        KTraHMuc = HMucNguon
        DienHangMuc = HMucNguon
    Else
        DienHangMuc = ""
    End If




'dien vao sheet Nhat ky
Sheet4.Cells(j, 2) = DienNgay
Sheet4.Cells(j, 3).Value = DienHangMuc 'hang muc
Sheet4.Cells(j, 4).Value = Sheet1.Cells(i, 3).Value 'noi dung cong vc
j = j + 1
End If


Next i
    BatDau = BatDau + 1
Loop
Application.ScreenUpdating = True
End Sub
Khi viết lại bạn vẫn đi theo lối mòn của code cũ.
Chỗ này
PHP:
Do While BatDau <= KetThuc
   ...
   BatDau = BatDau + 1
Loop
Phải nên viết như thế này:
PHP:
For i = BatDau To KetThuc
  ...
Next
 
Upvote 0
khi viết lại bạn vẫn đi theo lối mòn của code cũ.
Chỗ này
PHP:
do while batdau <= ketthuc
   ...
   Batdau = batdau + 1
loop
phải nên viết như thế này:
PHP:
for i = batdau to ketthuc
  ...
Next
đường nào cũng về la mã mà bác. Không bị lỗi vòng lặp
 
Upvote 0
Đường nào cũng về la mã mà bác. Không bị lỗi vòng lặp

Nhưng bạn chớ đào dường hầm từ đây đi La mã chứ bạn!

For I = BDau To KThuc
' . . . . . '
Next I

Nếu BDau> KThuc thì ta được báo lỗi;

Còn cái kia thì chạy hoài đền khi máy tính hết năng lượng

PHP:
do while batdau <= ketthuc

    ...
   Batdau = batdau + 1
loop

Ví dụ 2 trị 6/10/2015 & 7/1/2015 thì cái tham biến nào lớn hơn vậy bạn?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nhưng bạn chớ đào dường hầm từ đây đi La mã chứ bạn!

For I = BDau To KThuc
' . . . . . '
Next I

Nếu BDau> KThuc thì ta được báo lỗi; ???????????????????????

Còn cái kia thì chạy hoài đền khi máy tính hết năng lượng

PHP:
do while batdau <= ketthuc

    ...
   Batdau = batdau + 1
loop

Ví dụ 2 trị 6/10/2015 & 7/1/2015 thì cái tham biến nào lớn hơn vậy bạn?

Không có báo lỗi đâu. Nếu BDau > KThuc thì điều kiện vào vòng lặp không thoả. Tức là vòng lặp sẽ không chạy lượt nào cả.

Trên tiến trình hoạt động, vòng lặp For chỉ khác While ở chỗ cái trị so sánh cuối:
Trong vòng lặp For I = BDau To KThuc; cái trị KThuc được cố định. Dẫu bên trong vòng lặp có thay đổi KThuc thì trị ấy cũng chỉ có thể dùng để tính toán chứ nó không ảnh hưởng được vòng lặp.
Trong vòng lặp Do While batdau <= ketthuc; cái trị ketthuc là trị động. Nếu bên trong vòng lặp thay đổi nó thì ảnh hưởng tới vòng lặp.

Các bạn cần biết rõ lý thuyết này khi quyết định chọn lựa giữa For và While.

Đối với các bạn cần tốc độ, có lẽ cũng cần nên biết For chạy nhanh hơn While 1 chút (chỉ chút xíu thôi)
 
Upvote 0
Upvote 0
Chắc tác giả bài đăng gặp trường hợp giống lỗi như vầy:
PHP:
Option Explicit
Sub VongLapFor()
 Dim Dat1 As Date, Dat2 As Date, J As Integer
 
 Dat1 = #9/12/2015#:            Dat2 = #7/1/2015#
 For J = Dat1 To Dat2
    If J Mod 9 = 1 Then MsgBox Dat1 + J
 Next J
End Sub
 
Upvote 0
có mỗi cái vòng lặp mà cũng bị nói XỐI XẢ
giúp người cũng bị nói. (em ngu thì em dùng cách ngu) -0-/.
cáo biệt bác topic này của bác vanle33 nhe. tình hình là không đủ khả năng giúp bác rồi.
------------------------------
và chắc chắn rằng không lỗi được khi mà Bắt đầu luôn nhỏ hơn kết thúc.
tại sheet5 đã có công thức lấy 2 giá trị đó luôn rồi.
cho dù có định dạng ngày tháng năm hay tháng ngày năm cũng có sao
 
Lần chỉnh sửa cuối:
Upvote 0
có mỗi cái vòng lặp mà cũng bị nói XỐI XẢ
giúp người cũng bị nói. (em ngu thì em dùng cách ngu) -0-/.
cáo biệt bác topic này của bác vanle33 nhe. tình hình là không đủ khả năng giúp bác rồi.
Bạn đủ khả năng giúp mà. Tôi vẫn theo dõi cho dù không hiểu code. --=0
 
Upvote 0
Em copy toàn bộ code bài #37 thay cho code đang có trong file rồi nhấn Alt+Q
Thay đổi lại dữ liệu rồi nhấn Cap Nhat mà không thấy động tĩnh gì bác a.
Code bài đó chỉ là viết dễ nhìn (theo í mình quen) thôi;

Mình nghỉ là bạn đang vướng chổ thoát 1 trong 2 vòng lặp (hoặc tệ hơn là cả 2)

Với vòng lặp ngoài cần thử trước với các bước làm sau:

(*) Trước khi bước vô vòng lặp cần thêm câu lệnh khẳng đình Ngay1<= Ngay2 Nêu không thì fải có biến trung gian để đổi chúng lại, đảm bảo Ngay1 luôn < hay = Ngay2

Tiếp theo, với dữ liệu ngày-tháng trong vòng lặp thì mình hay viết vầy

Do
Ngay1= Ngay1 + 1
If Ngay1 > Ngay2 Then Exit Do

Loop

Chân fương & dễ hiểu hơn ba cái thứ Wend/While kia

Thứ nữa, đã có người nhắc bạn là tạm thời vô hiệu hóa dòng
On Error Resume Next
đi để còn biết bạn đang gặp lỗi gì;
Một khi ta làm chủ được lỗi gây ra ta mới xử lí nó hay viết/xài dòng lệnh này.

Thường mình xài cách bẫy lỗi sau

On Error Goto GPE

'. . . . . . . . .

Thoat: Exit Sub
GPE:
If Err <> 6 then
Resume Next
else
Goto Thoat
end if
End Sub
 
Upvote 0
Tôi có nhắc nhở là chỉ nên dùng vòng lặp while nếu giới hạn vòng lặp là biến động (KThuc có khả năng thay đổi bên trong vòng lặp). Nếu nó cố định thì For tốt hơn.

Còn một việc nữa là các bạn nên cẩn thận khi dùng biến Double để làm điều kiện:
Nên nhớ Double là trị không chính xác 100%. Điển hình là trường hợp này, nếu bạn dùng nó để đếm khoảng ngày thì phải coi chừng bị mất ngày đầu hoặc ngày cuối.

Vid dụ: Ngay1 là "01/11/2015 10:30am" và Ngay2 là "10/11/2015 9:30am"
Bạn dùng 1 biến Ngay để đếm. Sau 9 vòng, Ngay sẽ là "10/11/2015 10:30am", lớn hơn Ngay2.
Kết quả là vòng lặp bỏ sót ngày cuối cùng.

Vì vậy, khi dùng Double để tính điều kiện, bạn phải suy nghĩ cho kỹ về điều kiện chặn trên/chặn dưới của dữ liệu. Điển hình trường hợp trên, nếu bạn muốn gồm cả ngày cuối thì phải dùng Round trước khi so sánh (lưu ý: Round của VBA là dạng của Access, không bảo đảm giống Round của Excel. Nếu muón Round của Excel thì dùng Application.Round)
 
Upvote 0
tôi xem Chủ đề này riết rồi cũng chả hiểu là các code ở trên đã thỏa mãn chưa ?
cứ viết đại 1 đoạn ở đây
Mã:
Public Sub helloHamDuyet()
Dim r As Long, k As Long, dArr(1 To 65000, 1 To 4), arr
Dim startDate As Date, endDate As Date, ub As Long, h As Boolean
arr = Sheet1.Range("A17:K" & Sheet1.[A65000].End(xlUp).Row).Value
ub = UBound(arr)
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
        r = 1: h = False
        dArr(k, 1) = k
        dArr(k, 2) = startDate
        dArr(k, 4) = "Mua Công truong nghi"
        Do While arr(r, 1) <> arr(ub, 1)
            If arr(r, 11) = startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Nghiêm thu " & arr(r, 3)
                k = k + 1: h = True
            End If
            If arr(r, 6) <= startDate And arr(r, 7) >= startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Thi công " & arr(r, 3)
                k = k + 1: h = True
            End If
            r = r + 1
        Loop
        startDate = startDate + 1
        If Not h Then k = k + 1
    Loop
    .Range("A14:D14").Resize(k).Value = dArr
End With
End Sub
 
Upvote 0
PHP:
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
 ' . . . . . . . . . '

 Loop

Lỡ người dùng nhập vô StartDate > EndDate thì sao đây bạn thân mến?
Chuyện này rất dễ diễn ra do nhập các loại ngày < 13 của các tháng < 10

Có người dùng tưởng hệ Mẽo nên nhập 1/9/2015 thay vì 9/1/2015 (!)
Lúc này fải khai thêm 1 biến

Dim tDat As Date
If fDate > lDate Then
tDat = fDate: fDate= lDate
lDate = tDat
End If

Chỉ sau đó mới nhãy vô vòng lặp được.
Còn chuyện chạy ra kết quả sai hay đúng thì là chuyện tiếp tục xử khác hay không.
 
Upvote 0
PHP:
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
 ' . . . . . . . . . '

 Loop

Lỡ người dùng nhập vô StartDate > EndDate thì sao đây bạn thân mến?
Chuyện này rất dễ diễn ra do nhập các loại ngày < 13 của các tháng < 10

Có người dùng tưởng hệ Mẽo nên nhập 1/9/2015 thay vì 9/1/2015 (!)
Lúc này fải khai thêm 1 biến

Dim tDat As Date
If fDate > lDate Then
tDat = fDate: fDate= lDate
lDate = tDat
End If

Chỉ sau đó mới nhãy vô vòng lặp được.
Còn chuyện chạy ra kết quả sai hay đúng thì là chuyện tiếp tục xử khác hay không.

cám ơn thầy
đây là nội dung ô F5

ca9c902ec2439d962d9600105e7fd9b0.png




đã được Format theo chuẩn dd/MM/yyyy
và trong quá trình làm , người dùng nhập ngày tào lao thì người dùng phải tự chịu , không thể đổ trách nhiệm qua cho người viết code được ạ .
 
Upvote 0
tôi xem Chủ đề này riết rồi cũng chả hiểu là các code ở trên đã thỏa mãn chưa ?
cứ viết đại 1 đoạn ở đây
Mã:
Public Sub helloHamDuyet()
Dim r As Long, k As Long, dArr(1 To 65000, 1 To 4), arr
Dim startDate As Date, endDate As Date, ub As Long, h As Boolean
arr = Sheet1.Range("A17:K" & Sheet1.[A65000].End(xlUp).Row).Value
ub = UBound(arr)
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
        r = 1: h = False
        dArr(k, 1) = k
        dArr(k, 2) = startDate
        dArr(k, 4) = "Mua Công truong nghi"
        Do While arr(r, 1) <> arr(ub, 1)
            If arr(r, 11) = startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Nghiêm thu " & arr(r, 3)
                k = k + 1: h = True
            End If
            If arr(r, 6) <= startDate And arr(r, 7) >= startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Thi công " & arr(r, 3)
                k = k + 1: h = True
            End If
            r = r + 1
        Loop
        startDate = startDate + 1
        If Not h Then k = k + 1
    Loop
    .Range("A14:D14").Resize(k).Value = dArr
End With
End Sub
Code chạy nhanh.
Nhưng tại sheet Nhat ky xuất kết quả ra bạn chỉnh code để
Nếu có nhiều công việc nghiệm thu hoặc thi công ,... trong 1 ngày thì tại cột B chỉ ghi 1 ngày
Phần tôi tô màu vàng Chỉ có số 100 ở A113 và ngày 24/07/2015 tại B113, các cell A114, A115, A116, B114, B115, B116 để trống. 117 và B117 sẽ là số thứ tự và ngày công việc tiếp theo.
 

File đính kèm

  • 2.jpg
    2.jpg
    140.8 KB · Đọc: 27
Upvote 0
Tôi chỉ muốn code chạy ra kết quả như bài #20
xóa bỏ hết tất cả những gì liên quan thời gian max, min.
Chỉ đơn giản là tìm bên sheet Danh muc có đầu việc nào (tương ứng với ngày nào) thì lọc sang sheet Nhat ky. Đầu việc nào có thời gian thi công "Bắt đầu" và "Kết thúc" thì đầu việc đó sẽ được lặp đi, lặp lại tại nhiều dòng (= nhiều ngày).
Chỉ đơn giản vậy thôi.
Mong các thành viên sửa code cho tôi.
 
Upvote 0
Tôi chỉ muốn code chạy ra kết quả như bài #20
xóa bỏ hết tất cả những gì liên quan thời gian max, min.
Chỉ đơn giản là tìm bên sheet Danh muc có đầu việc nào (tương ứng với ngày nào) thì lọc sang sheet Nhat ky. Đầu việc nào có thời gian thi công "Bắt đầu" và "Kết thúc" thì đầu việc đó sẽ được lặp đi, lặp lại tại nhiều dòng (= nhiều ngày).
Chỉ đơn giản vậy thôi.
Mong các thành viên sửa code cho tôi.
anh nói tới #20 thì không đơn giản
cột H , I là yếu tố giờ phút , nó có liên quan gì ở đây ???
 
Upvote 0
anh nói tới #20 thì không đơn giản
cột H , I là yếu tố giờ phút , nó có liên quan gì ở đây ???
Có 2 cách để làm Nhật ký thi công
1) Thực hiện 1 cách TỔNG QUAN CHUNG CHUNG thì chỉ yêu cầu như #58.
2) Thực hiện 1 cách CHI TIẾT của cách 1 thêm giờ phút vào ngày nghiệm thu công việc.
Tôi nói như thế này để bạn hình dung một phần công việc thi công xây dựng
Công việc A thi công trong khoảng thời gian từ ngày 01/05/2015 (cột F) đến 09/05/2015 (cột G). Đến ngày 09/05/2015 là xong thì vào ngày (cột J) Nhà thầu sẽ yêu cầu Chủ đầu tư, Tư vấn giám sát tổ chức nghiệm thu vào giờ phút (cột H) ngày 10/05/2015 (cột K).
Sau khi có Phiếu yêu cầu thì 3 bên Nhà thầu, Tư vấn giám sát sẽ nghiệm thu vào lúc giờ phút (cột H) đến giờ phút (cột I) ngày 10/05/2015 (cột K) .
Khi chuyển sang ghi Nhật ký thì nếu làm 1 cách CHI TIẾT thì phải ghi tất cả những dữ liệu là các cột chữ đậm vào Nhật ký
01/05/2015 : Thi công việc A
.....
09/05/2015 : Thi công việc A
Yêu cầu nghiệm thu công việc A vào lúc (cột H) ngày (cột K)
10/05/2015 : Nghiệm thu công việc A từ lúc (cột H) đến (cột I) ngày (cột K)


----
Vậy là xong 1 công việc A chuyển sang viết lần lượt tất cả các công việc khác.
 
Upvote 0
Cái này gọi là nhật ký hay là hồi ký nữa không biết.
 
Upvote 0
Cái này gọi là nhật ký hay là hồi ký nữa không biết.

Đã là nhật ký , nhật ký công trường thì phải ghi trung thực ghi tay là tốt nhất, hoặc là chí ít phải nhập vào máy tính từng ngày.
Làm kiểu như ở topic này là chống đối. Chúng ta cứ hỏi đường xa không tốt, công trình tượng đài, công trình công cộng khác nhanh xuống cấp, thiếu giám sát chặt chẽ,...., chất lượng không tốt là do đâu... Vậy mà cứ giúp thế này là tiếp tay cho sự làm ẩu, chống chế, làm cho có, đã vậy lại còn muốn tự động chống chế làm ẩu, tự động chống chế nhanh ẩu. Đề nghị mọi người hãy đặt lòng tốt đúng chỗ (vì làm sai mục tiêu của nhật ký, nhật ký giúp ghi nhận mọi hoạt động cũng như làm người kỹ sư, những người liên quan có trách nhiệm hơn, và căn cứ kiểm soát sau này).
Nếu cái này không đúng với trường hợp riêng của chủ topic thì đề nghị chủ topic giải thích và bỏ qua ý chung trên.
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này gọi là nhật ký hay là hồi ký nữa không biết.
Nhiều khi không phải do Nhà thầu muốn làm thế đâu bạn mà do Chủ đầu tư quyết định, quyết luôn cho cả Tư vấn giám sát, Nhà thầu. Đâu phải cứ thẳng thắn chuẩn chỉ là đúng, là tốt đâu. Nhiều khi biết sai vẫn phải làm. Cơ chế VN nhiều khi là vậy --=0
Miễn là làm việc, hoạt động trong giới hạn cho phép là OK.
Vấn đề ở đây là tôi nhờ các cao thủ chỉnh code để đạt yêu cầu.
 
Upvote 0
Nhiều khi không phải do Nhà thầu muốn làm thế đâu bạn mà do Chủ đầu tư quyết định, quyết luôn cho cả Tư vấn giám sát, Nhà thầu. Đâu phải cứ thẳng thắn chuẩn chỉ là đúng, là tốt đâu. Nhiều khi biết sai vẫn phải làm. Cơ chế VN nhiều khi là vậy --=0
Miễn là làm việc, hoạt động trong giới hạn cho phép là OK.
Vấn đề ở đây là tôi nhờ các cao thủ chỉnh code để đạt yêu cầu.

#62 nói là em phải có trách nhiệm hơn kìa
anh muốn em sống sao ? ....
 
Upvote 0
Đã là nhật ký , nhật ký công trường thì phải ghi trung thực ghi tay là tốt nhất, hoặc là chí ít phải nhập vào máy tính từng ngày.
Làm kiểu như ở topic này là chống đối. Chúng ta cứ hỏi đường xa không tốt, công trình tượng đài, công trình công cộng khác nhanh xuống cấp, thiếu giám sát chặt chẽ,...., chất lượng không tốt là do đâu... Vậy mà cứ giúp thế này là tiếp tay cho sự làm ẩu, chống chế, làm cho có, đã vậy lại còn muốn tự động chống chế làm ẩu, tự động chống chế nhanh ẩu. Đề nghị mọi người hãy đặt lòng tốt đúng chỗ (vì làm sai mục tiêu của nhật ký, nhật ký giúp ghi nhận mọi hoạt động cũng như làm người kỹ sư, những người liên quan có trách nhiệm hơn, và căn cứ kiểm soát sau này).
Nếu cái này không đúng với trường hợp riêng của chủ topic thì đề nghị chủ topic giải thích và bỏ qua ý chung trên.
Không biết bác có làm xây dựng không em không biết.
Cách này hay ở 1 chỗ làm tự động liệt kê công việc theo ngày tháng ra luôn
Còn nếu làm ngày nào ghi ngày đó thì có một số vấn đề xảy ra
một là đã ghi (ghi tay) từng ngày rồi. sau này nếu giám sát muốn đổi ngày để đúng lịch trình ( chỗ này xin giải thích thế này: công trình rao lên, nhà thầu đi đấu, nhưng chỉ là hình thức, thực tế là đã bàn giao mặt bằng cho nhà thầu và thi công vài hạng mục rồi, như vậy khi trúng thầu và được bàn giao mặt bằng ví dụ là 20/10/2015, mà trong khi đó do 1 số lý do nào đó mà nhà thầu đã nhận mặt bằng vào 1/10/2015- trước 19 ngày- như thế tiến độ sẽ nhanh hơn thời gian thực là 19 ngày thì làm biết bao nhiêu công việc rồi)
như vậy bác ghi tay. thì lúc ghi nhận mặt bằng ngày mấy.
giả xử 30/10/2015 bác thi công đóng cọc mố. (bê tông đã đủ tuổi do nhận mặt bằng 1/10/2015 và xử dụng phụ gia)
nếu ghi là 20/10/2015 thì liệu có kịp làm để đóng cọc ngày 30 không.
thực tế bây giờ những người dưới công trình không được mấy ai ghi nhật ký đâu
toàn đưa về công ty cho lính lác ghi không à
còn ngày tháng thì binh biến tùm lum

Nhiều khi không phải do Nhà thầu muốn làm thế đâu bạn mà do Chủ đầu tư quyết định, quyết luôn cho cả Tư vấn giám sát, Nhà thầu. Đâu phải cứ thẳng thắn chuẩn chỉ là đúng, là tốt đâu. Nhiều khi biết sai vẫn phải làm. Cơ chế VN nhiều khi là vậy --=0
Miễn là làm việc, hoạt động trong giới hạn cho phép là OK.
Vấn đề ở đây là tôi nhờ các cao thủ chỉnh code để đạt yêu cầu.
còn vụ bác này. cái vụ ngày giờ này kia em nghĩ được nhưng có quan trọng không
em cũng xây dựng nên hiểu công việc của bác
hiện tại em cũng có 1 công trình
giám sát đưa list ngày tháng để ghi nhật ký thời gian 1 năm rưỡi
yêu cầu ghi trong 2 ngày.
thử hỏi liệu có kịp không nếu làm bằng tay nhìn mà lọc ra công việc nào ngày nào
em nghĩ code như thế là được rồi
nhật ký bác vẫn còn thiếu 1 mục nhân công, máy moc xử dụng trong ngày đó như thế nào nữa nha.
bác thử code ngu của em thế nào. tuy không nhanh nhưng vẫn giải quyết vụ điền ngày vs STT

Mã:
Sub NhatKy()
'Application.ScreenUpdating = False




Dim MangDanhMuc, MangNhatKy(1 To 60000, 1 To 11)
Dim Khoang, i, m, c As Long
c = Sheet1.UsedRange.Rows.Count
'===============================================
MangDanhMuc = Sheet1.Range("A18:A" & c).Resize(, 11)
'm = Sheet1.[A65536].End(3).Row






BatDau = Sheet5.Range("F5").Value
KetThuc = Sheet5.Range("F6").Value


j = 1 'dong thu j
k = 1 'so thu tu
'xoa du lieu
Sheet4.Range("A14:E100").Value = ""
'vong lap ket thuc khi ngay bat dau > ngay ket thuc
Do While BatDau <= KetThuc
For i = 1 To c - 18
BD = MangDanhMuc(i, 6)
KT = MangDanhMuc(i, 7)
If BD = "" Or KT = "" Then GoTo Nex
'kiem tra xem cong viec co namg trong khoang thoi gian xxxx khong
If BD <= BatDau And KT >= BatDau Then




'kiem tra ngay de dien vao
    If KTraNgay <> BatDau Then
        KTraNgay = BatDau
        DienNgay = BatDau
    Else
        DienNgay = ""
    End If
'kiem tra va dien hang muc
    HMucNguon = MangDanhMuc(i, 2)
    If KTraHMuc <> HMucNguon Then
        KTraHMuc = HMucNguon
        DienHangMuc = HMucNguon
    Else
        DienHangMuc = ""
    End If
'kien tra va dien STT
    If DienNgay <> "" Then
    MangNhatKy(j, 1) = k
    'MsgBox MangNhatKy(j, 1)
    k = k + 1
    End If






'dien vao sheet Nhat ky
MangNhatKy(j, 2) = DienNgay
MangNhatKy(j, 3) = DienHangMuc 'hang muc
MangNhatKy(j, 4) = MangDanhMuc(i, 3) 'noi dung cong vc
j = j + 1


Else
For m = 1 To j
If MangNhatKy(m, 2) = BatDau Then
    Tim = 1
    GoTo Tiep
Else
    Tim = 0
End If


Next m
Tiep:
    If Tim > 0 Then
        GoTo Nex
    Else
        If i = c - 18 Then
            MangNhatKy(j, 1) = k
            k = k + 1
            MangNhatKy(j, 2) = BatDau
            MangNhatKy(j, 4) = "Mýa, Công trýõÌng nghiÒ"
            j = j + 1
        End If
    End If
End If
Nex:


Next i
    BatDau = BatDau + 1
Loop
Range("A14:D14").Resize(j).Value = MangNhatKy
Application.ScreenUpdating = True
End Sub
em đã sửa dữ liệu nên nhìn hơi khác nha
View attachment 150502
 
Lần chỉnh sửa cuối:
Upvote 0
Không biết bác có làm xây dựng không em không biết.
Cách này hay ở 1 chỗ làm tự động liệt kê công việc theo ngày tháng ra luôn
Còn nếu làm ngày nào ghi ngày đó thì có một số vấn đề xảy ra
một là đã ghi (ghi tay) từng ngày rồi. sau này nếu giám sát muốn đổi ngày để đúng lịch trình ( chỗ này xin giải thích thế này: công trình rao lên, nhà thầu đi đấu, nhưng chỉ là hình thức, thực tế là đã bàn giao mặt bằng cho nhà thầu và thi công vài hạng mục rồi, như vậy khi trúng thầu và được bàn giao mặt bằng ví dụ là 20/10/2015, mà trong khi đó do 1 số lý do nào đó mà nhà thầu đã nhận mặt bằng vào 1/10/2015- trước 19 ngày- như thế tiến độ sẽ nhanh hơn thời gian thực là 19 ngày thì làm biết bao nhiêu công việc rồi)
như vậy bác ghi tay. thì lúc ghi nhận mặt bằng ngày mấy.
giả xử 30/10/2015 bác thi công đóng cọc mố. (bê tông đã đủ tuổi do nhận mặt bằng 1/10/2015 và xử dụng phụ gia)
nếu ghi là 20/10/2015 thì liệu có kịp làm để đóng cọc ngày 30 không.
thực tế bây giờ những người dưới công trình không được mấy ai ghi nhật ký đâu
toàn đưa về công ty cho lính lác ghi không à
còn ngày tháng thì binh biến tùm lum

Vậy thì chào thua, đừng hỏi tại sao tùm lum, tại sao sai, và tại sao tại sao ... mọi thứ lại thế ...vì: nó thế nên nó vẫn thế.
Nhưng anh em ở đây chia sẻ lòng tốt vì một XH tốt lên chứ không phải là vì những cái làm ngày càng tồi tệ hơn.
Đó là nói chung thê, còn vào thế thì phải thế là trường hợp riêng rui... bắc thang lên hỏi ông trời vậy. Mọi người cứ giúp tiếp đi vì đó là về code , đôi khi đẩy cho nó phát triển nhanh cho chóng qua nhanh.
 
Upvote 0
Việc ma số liệu để chế hồi ký thế này phải dùng ms project chứ excel làm vụ này không ăn thua.
 
Upvote 0
Phải làm trong ngành thì mới hiểu tại sao phải chế cháo ra Hồ sơ. Chế nhưng vẫn KHỚP là OK trong 1 giới hạn cho phép. Vẫn sống và làm việc theo hiến pháp và pháp luật!
 
Upvote 0
to langtuchungtinh :
giờ thì không nhất thiết phải đưa vào ngày nghiệm thu. Chỉ khi Tư vấn GS yêu cầu quá chặt chẽ thì ta phải làm CHI TIẾT.
Đúng còn mục thời tiết, máy móc thiết bị nhân lực trong Nhật ký nữa.
Thử chạy code của bạn sao chỉ thấy dữ liệu xuất ra từ dòng có TT 88 trở đi?
 
Lần chỉnh sửa cuối:
Upvote 0
Phải làm trong ngành thì mới hiểu tại sao phải chế cháo ra Hồ sơ. Chế nhưng vẫn KHỚP là OK trong 1 giới hạn cho phép. Vẫn sống và làm việc theo hiến pháp và pháp luật!
Chế một vài hạng mục độc lập thấy có vẻ là khớp nhưng nếu ráp toàn bộ hồ sơ các hạng mục của một công trình lại thì xem ra dùng excel không qua được tay cứng được đâu.
Chỉ cần lập tiến độ hóa đơn, tiến độ biên bản và tiến độ nhật ký, khớp hay không sẽ biết ngay.
 
Upvote 0

File đính kèm

Upvote 0
Bạn thử file này. Tôi để ngày bàn giao mặt bằng 07/07/2015 thì chạy code của doveandrose bị lỗi.
Không phải lỗi mà là dữ liệu bác đưa sai
tải lại file #1 rồi so sánh với #73 xem. 2 file cấu trúc khác nhau
file #1 thì có tùm lum ngày thi công hết, trong khi đó # 73 lại trống rỗng, chỉ có mỗi ngày nghiệm thu
vậy bác nói rõ căn cứ vào cột nào để so sánh và điền vào. code của tui và dovanrose đều căn cứ vào ngày bắt đầu và thi công để so sánh đấy
 
Upvote 0
Không phải lỗi mà là dữ liệu bác đưa sai
tải lại file #1 rồi so sánh với #73 xem. 2 file cấu trúc khác nhau
file #1 thì có tùm lum ngày thi công hết, trong khi đó # 73 lại trống rỗng, chỉ có mỗi ngày nghiệm thu
vậy bác nói rõ căn cứ vào cột nào để so sánh và điền vào. code của tui và dovanrose đều căn cứ vào ngày bắt đầu và thi công để so sánh đấy
Tôi sẽ thêm ngày Bắt đầu và Kết thúc và ngày Yêu cầu vào sau bạn ah.
Tôi muốn như ở #58 đó bạn. Đó là cách TỔNG QUAN CHUNG CHUNG mà tôi nói ở #60 đó.
 
Upvote 0
Tôi sẽ thêm ngày Bắt đầu và Kết thúc và ngày Yêu cầu vào sau bạn ah.
Tôi muốn như ở #58 đó bạn. Đó là cách TỔNG QUAN CHUNG CHUNG mà tôi nói ở #60 đó.
vậy chỉ căn cứ ngày bắt đầu với ngày nghiệm thu để điền thôi đúng không
Mã:
Sub NhatKy()
Application.ScreenUpdating = False
Dim MangDanhMuc, MangNhatKy(1 To 60000, 1 To 11)
'==============================================
Dim i, m, c, STT As Long
Dim BigRng As Range
On Error Resume Next
With Sheet1.Range("A1").SpecialCells(2)
   Set BigRng = .Areas(1)
   For i = 1 To .Areas.Count
     Set BigRng = Range(Sheet1.Cells(18, 1), .Areas(i))
   Next i
End With
MangDanhMuc = BigRng
'===============================================


c = UBound(MangDanhMuc, 1)


BatDau = Sheet5.Range("F5").Value
KetThuc = Sheet5.Range("F6").Value


j = 1 'dong thu j
STT = 1 'so thu tu
'xoa du lieu
Sheet4.Range("A14:E" & Sheet4.UsedRange.Rows.Count).Value = ""


'vong lap ket thuc khi ngay bat dau > ngay ket thuc
Do While BatDau <= KetThuc
For i = 1 To c
BD = MangDanhMuc(i, 6)
If BD <> 0 Then BDTam = BD
KT = MangDanhMuc(i, 11)
'If BD = "" Or KT = "" Then GoTo Nex
'kiem tra xem cong viec co namg trong khoang thoi gian xxxx khong
If BDTam <= BatDau And KT < KetThuc Then




'kiem tra ngay de dien vao
    If KTraNgay <> BatDau Then
        KTraNgay = BatDau
        DienNgay = BatDau
    Else
        DienNgay = ""
    End If
'kiem tra va dien hang muc
    HMucNguon = MangDanhMuc(i, 2)
    If KTraHMuc <> HMucNguon Then
        KTraHMuc = HMucNguon
        DienHangMuc = HMucNguon
    Else
        DienHangMuc = ""
    End If
'kien tra va dien STT
    If DienNgay <> "" Then
    MangNhatKy(j, 1) = STT
    STT = STT + 1
    End If


'dien vao sheet Nhat ky
MangNhatKy(j, 2) = DienNgay
MangNhatKy(j, 3) = DienHangMuc 'hang muc
MangNhatKy(j, 4) = MangDanhMuc(i, 3) 'noi dung cong vc
j = j + 1


Else
For m = 1 To j
If MangNhatKy(m, 2) = BatDau Then
    Tim = 1
    GoTo Tiep
Else
    Tim = 0
End If


Next m
Tiep:
    If Tim > 0 Then
        GoTo Nex
    Else
        If i = c Then
        
            MangNhatKy(j, 1) = STT
            STT = STT + 1
            MangNhatKy(j, 2) = BatDau
            MangNhatKy(j, 4) = "Mua, Cong Truong Nghi"
            j = j + 1
        End If
    End If


    
End If
Nex:
Next i
    BatDau = BatDau + 1
Loop
Sheet4.Range("A14:D14").Resize(j).Value = MangNhatKy
Application.ScreenUpdating = True
End Sub
mấy khoảng trống đó là do bảng dữ liệu bác chưa điền.
bác không đưa dữ liệu chính lên thì tui chịu, nghỉ chỉnh nữa rồi
mỗi lần chỉnh lại đưa dữ liệu khác
thiếu này thiếu kia......
lại thêm cái pass vba. tui chả rảnh đâu mà cứ mỗi lần giúp lại phải phá pass mất thời gian
---------------------------------
bác cứ nói chung chung cuối cùng chả biết là lấy mốc căn cứ nào để mà so sánh điền vào cho vừa ý bác nữa. ba hồi thì thời gian bắt đầu kết thúc, ba hồi thì lại là thời gian bắt đầu với nghiệm thu
---------------------------------
với số lượng gần 4k bài gửi mà nói không biết viết code thì cũng phục bác thật
 
Lần chỉnh sửa cuối:
Upvote 0
Thôi đi ngủ, không thấy trả lời chắc ok rồi/-*+/
lo làm tào lao )(&&@@ không lo hồ sơ ;;;;;;;;;;; mai lại bị cha giám sát lôi ra chém+-+-+-+
 
Upvote 0
1) bác cứ nói chung chung cuối cùng chả biết là lấy mốc căn cứ nào để mà so sánh điền vào cho vừa ý bác nữa. ba hồi thì thời gian bắt đầu kết thúc, ba hồi thì lại là thời gian bắt đầu với nghiệm thu
---------------------------------
2) với số lượng gần 4k bài gửi mà nói không biết viết code thì cũng phục bác thật
Qua quá trình sử dụng thấy code của tác giả file Nhat ky gây lỗi do không phù hợp với dữ liệu của tôi nên phải điều chỉnh.
Xin trả lời bạn như sau:
1) Tiêu chí để viết Nhật ký là căn cứ theo cột F, cột G, cột J, cột K. Như bài #58 tôi đã nói, bỏ qua tất cả vòng lặp gì đó liên quan đến thời gian min max gì đó. Còn cột H và cột I chỉ để làm Biên bản nghiệm thu và Phiếu yêu cầu, chỉ thêm vào khi viết Nhật ký CHI TIẾT.
2) Tôi chưa biết và viết được 1 chữ nào trong code luôn.
Cảm ơn bạn!

p/s : cha giám sát ghê nhỉ, thế bạn nghĩ "mưu" để "đẩy" đi. --=0
 
Upvote 0
Chạy thử code của bạn langtuchungtinh bài #76 thấy không ổn rồi
+) Ra kết quả lại có 1 lô, 1 lốc các đầu việc trong cùng 1 ngày. Mà ngày đó bên sheet Danh muc không có các đầu việc đó!
+) Hết 1 lô đầu việc đấy lại có 1 đoạn dài các dòng trắng không có dữ liệu.
 
Upvote 0
Bạn thử file này. Tôi để ngày bàn giao mặt bằng 07/07/2015 thì chạy code của doveandrose bị lỗi.
file này so với file #1 khác xa nhau , cột B, F,G trống trơn thì code chạy cái gì được . yêu cầu giúp về code nhưng lại đặt password VBA đã là khó chấp nhận , mà anh nói là file không phải của anh nên không biết pass mà code thì anh cập nhật liên tục vào file ?

37640e5defb73f590bfedc336cf0167e.png




người ta viết code xong thì sửa cấu trúc dữ liệu rồi nói code chạy lỗi lại càng không thể chấp nhận
khi cảm thấy không vừa ý là tôi nói thẳng chứ không ngại ai cả , nhiều người ở diễn đàn này biết tôi viết code xong mà người dùng thay đổi cấu trúc dữ liệu rồi kêu tôi code lại là tôi bỏ chạy luôn , và lần này cũng vậy .
 
Upvote 0
file này so với file #1 khác xa nhau , cột B, F,G trống trơn thì code chạy cái gì được . yêu cầu giúp về code nhưng lại đặt password VBA đã là khó chấp nhận , mà anh nói là file không phải của anh nên không biết pass mà code thì anh cập nhật liên tục vào file ?
.
Tôi đã nói chuyện pass VBA tại #1 bạn quét chuột chọn dòng dữ liệu sau chữ VBA đến dấu chấm sẽ thấy. :-=
Bạn giúp tôi chỉnh code để đơn giản chỉ kết quả như #58, #57 và #78 thôi. Code của bạn đã khá OK rồi.
 
Upvote 0
Tôi đã nói chuyện pass VBA tại #1 bạn quét chuột chọn dòng dữ liệu sau chữ VBA đến dấu chấm sẽ thấy. :-=
Bạn giúp tôi chỉnh code để đơn giản chỉ kết quả như #58, #57 và #78 thôi. Code của bạn đã khá OK rồi.
Tôi nói câu này chắc hơi vô duyên:
" thì bác cứ nói mẹ pass ra cho rồi, quét quyết gì nữa rồi mới thấy"
Muốn làm được thì chút ít cũng cho 1 vài kết quả với dữ liệu đầy đủ vài cái chứ, bác cứ nói dựa cột này cột kia, ý là tui bên xây dựng còn không hiểu, nói gì "chim hồng" không phải dân xây dựng làm sao hiểu ý bác muốn gì.
Thứ 1: muốn được giúp gì thì 1 là đưa dữ liệu mẫu gần giống nhất với file thật (nếu file có tính bảo mật)
Thứ 2: trình bày kết quả mong muốn có được
Thứ 3: trình bày cách làm thế nào ra kết quả đó
Bác có nhiều bài viết vậy, tham gia diễn đàn trước tui, lâu hơn tui, không lẽ bác không biết làm thế nào để người giúp dễ hiểu ý mình muốn để được kết quả mong muốn.
Nói nhiều vậy thôi, cũng chả giúp nữa đâu, ba hồi nói ý thế này thế kia chả biết đường mà lần
 
Upvote 0
Tui sẽ gợi ý cách sửa code #58
Bổ xung cái này vào sau chữ loop
For i= 1 to k-1
A= dArr(k,2)
B= dArr(k+1,2)
If A<>"" then Tam= A
If B= Tam then dArr(k+1,2)=""
Next i
 
Upvote 0
Xin góp í nhỏ với Langtuchungtinh360;688648

. . . .
Thứ 1: Muốn được giúp gì thì 1 là đưa dữ liệu mẫu gần giống nhất với file thật (nếu file có tính bảo mật)
Thứ 2: trình bày kết quả mong muốn có được
Thứ 3: trình bày cách làm thế nào ra kết quả đó

Theo kinh nghiệm của mình, file giả lập hay/rất hay sẽ là file có đủ các fương án sẩy ra; Chuyện này khác với file có trong thực tế đang sử dụng.

Ví dụ bảng chấm công (BCC) của CQ; ta muốn tổng hợp thì fải có trên nớ tất thẩy các loại công đã qui định của CQ đó; chứ không fải là 1 BCC thực của 1 tháng nào đó trong CQ dù BCC đó có là 31 ngày đi chăng nữa.
 
Upvote 0
to langtuchungtinh:
Không phải quét chữ mà tôi nói ở #81 và #1 là có pass VBA đâu. Thế là bạn không biết bác siwtom và các độc chiêu của bác ý rồi. Có chạy code của bác siwtom cũng không ra pass VBA đâu.
 
Upvote 0
to langtuchungtinh:
Không phải quét chữ mà tôi nói ở #81 và #1 là có pass VBA đâu. Thế là bạn không biết bác siwtom và các độc chiêu của bác ý rồi. Có chạy code của bác siwtom cũng không ra pass VBA đâu.
Vậy cái phần t bổ xung đó đúng yêu cầu chưa
 
Upvote 0
Sau khi tôi bổ sung rồi chạy code thì ra cái này
lấy cái này dán vô thay thế nha
Mã:
Public Sub helloHamDuyet()
Dim r As Long, k As Long, dArr(1 To 65000, 1 To 4), arr
Dim startDate As Date, endDate As Date, ub As Long, h As Boolean
arr = Sheet1.Range("A17:K" & Sheet1.[A65000].End(xlUp).Row).Value
ub = UBound(arr)
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
    .Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
    k = 1
    Do While WorksheetFunction.RoundDown(startDate, 0) <= _
             WorksheetFunction.RoundDown(endDate, 0)
        r = 1: h = False
        dArr(k, 1) = k
        dArr(k, 2) = startDate
        dArr(k, 4) = "Mua Công truong nghi"
        Do While arr(r, 1) <> arr(ub, 1)
            If arr(r, 11) = startDate Then
                dArr(k, 1) = k
                dArr(k, 2) = startDate
                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Nghiêm thu " & arr(r, 3)
                k = k + 1: h = True
            End If
            If arr(r, 6) <= startDate And arr(r, 7) >= startDate Then
                dArr(k, 1) = k


                dArr(k, 2) = startDate


                dArr(k, 3) = arr(r, 2)
                dArr(k, 4) = "Thi công " & arr(r, 3)
                k = k + 1: h = True
            End If
            r = r + 1
        Loop
        startDate = startDate + 1
        If Not h Then k = k + 1
    Loop
    
[COLOR=#ff0000]Dim l, Tren, Duoi As Long
l = 1
For i = 1 To k - 1
Tren = dArr(i, 2)
Duoi = dArr(i + 1, 2)
If Tren <> "" Then Tam = Tren
If Tam = Duoi Then
dArr(i + 1, 2) = ""
End If
If dArr(i, 2) <> "" Then
dArr(i, 1) = l
l = l + 1
Else
dArr(i, 1) = ""
End If
Next i[/COLOR]


    .Range("A14:D14").Resize(k).Value = dArr
End With
End Sub
nếu có phát sinh hay không được nữa bác tự xử đi nha. (làm xong cái này lại lòi cái kia)
 
Upvote 0
Các bạn chỉnh giúp tôi code dưới đây để khi xuất kết quả tại Sheet Nhật ký thì nếu có 1 công việc vừa có Thi công ... và Nghiệm thu ... trong 1 ngày thì dòng Thi công ... sẽ được ở trên dòng Nghiệm thu ... công việc đó. (Hiện tại Kết quả xuất ra thì dòng Nghiệm thu ... lại ở trên dòng Thi công ...)
Public Sub hello1HamDuyet()
Dim r As Long, k As Long, dArr(1 To 65000, 1 To 4), arr
Dim startDate As Date, endDate As Date, ub As Long, h As Boolean
arr = Sheet1.Range("A17:K" & Sheet1.[A65000].End(xlUp).Row).Value
ub = UBound(arr)
startDate = Sheet5.[F5].Value
endDate = Sheet5.[F6].Value
With Sheet4
.Range("A14:D" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row).ClearContents
k = 1
Do While WorksheetFunction.RoundDown(startDate, 0) <= _
WorksheetFunction.RoundDown(endDate, 0)
r = 1: h = False
dArr(k, 1) = k
dArr(k, 2) = startDate
dArr(k, 4) = " " 'Da xoa chu Mua cong truong nghi
Do While arr(r, 1) <> arr(ub, 1)
If arr(r, 11) = startDate Then
dArr(k, 1) = k
dArr(k, 2) = startDate
dArr(k, 3) = arr(r, 2)
dArr(k, 4) = "Nghiêm thu " & arr(r, 3)
k = k + 1: h = True
End If
If arr(r, 6) <= startDate And arr(r, 7) >= startDate Then
dArr(k, 1) = k
dArr(k, 2) = startDate
dArr(k, 3) = arr(r, 2)
dArr(k, 4) = "Thi công " & arr(r, 3)
k = k + 1: h = True
End If
r = r + 1
Loop
startDate = startDate + 1
If Not h Then k = k + 1
Loop
.Range("A14:D14").Resize(k).Value = dArr
End With
End Sub
Xin cảm ơn!
 
Upvote 0
Không có file thì cũng khó mà giải quyết được vấn đề;
Nhưng mình đoán là liên quan đến 2 khổ lệnh này:
PHP:
    Do While Arr(R, 1) <> Arr(uB, 1)
1       If Arr(R, 11) = startDate Then
            dArr(K, 1) = K:         dArr(K, 2) = startDate
            dArr(K, 3) = Arr(R, 2): dArr(K, 4) = "Nghiêm thu " & Arr(R, 3)
            K = K + 1:              H = True
        End If
            
2       If Arr(R, 6) <= startDate And Arr(R, 7) >= startDate Then
            dArr(K, 1) = K:         dArr(K, 2) = startDate
            dArr(K, 3) = Arr(R, 2): dArr(K, 4) = "Thi công " & Arr(R, 3)
            K = K + 1:              H = True
        End If
        R = R + 1
   Loop
Nhưng chưa rõ là cột/trường chứa các từ 'Nghiệm thu' hay 'Thi công' nằm ở nơi mô?
Nến đành chờ file hay bạn nói rõ hơn!
)*&^)
 
Upvote 0
Không có file thì cũng khó mà giải quyết được vấn đề;
Nhưng mình đoán là liên quan đến 2 khổ lệnh này:
PHP:
    Do While Arr(R, 1) <> Arr(uB, 1)
1       If Arr(R, 11) = startDate Then
            dArr(K, 1) = K:         dArr(K, 2) = startDate
            dArr(K, 3) = Arr(R, 2): dArr(K, 4) = "Nghiêm thu " & Arr(R, 3)
            K = K + 1:              H = True
        End If
            
2       If Arr(R, 6) <= startDate And Arr(R, 7) >= startDate Then
            dArr(K, 1) = K:         dArr(K, 2) = startDate
            dArr(K, 3) = Arr(R, 2): dArr(K, 4) = "Thi công " & Arr(R, 3)
            K = K + 1:              H = True
        End If
        R = R + 1
   Loop
Nhưng chưa rõ là cột/trường chứa các từ 'Nghiệm thu' hay 'Thi công' nằm ở nơi mô?
Nến đành chờ file hay bạn nói rõ hơn!
)*&^)
Đúng là 2 chỗ trên đó bác. Em không hiểu code nên không cut dán đổi vị trí 2 đoạn code trên được.
File thì bác xem file đính kèm. Bác chèn code ở #89 vào là chạy được.
 

File đính kèm

Upvote 0
File thì bác xem file đính kèm. Bác chèn code ở #89 vào là chạy được.
Có cắt dán VBA gì được đâu?, Nó đâu cho fép làm điều đó!
Với lại file chỉ có 2 trang tính; Nhưng ở 2 trang này không có những từ như bạn đề cập.
 
Upvote 0
Có cắt dán VBA gì được đâu?, Nó đâu cho fép làm điều đó!
Với lại file chỉ có 2 trang tính; Nhưng ở 2 trang này không có những từ như bạn đề cập.
Dữ liệu đầu vào thì ở bên Sheet Danh mục (có thể gồm 1 vài trang hoặc 1 vài chục trang), dữ liệu được xuất ra tại Sheet Nhật ký bác ạ. Bác tạo 1 nút bấm và gán code ở #89 vào là chạy được. Nhưng chưa đúng yêu cầu như em đã nói ở #89.
Em không hiểu nút LÊ VĂN em tạo lại không chạy được code, hihì.
 
Upvote 0
Dữ liệu đầu vào thì ở bên Sheet Danh mục (có thể gồm 1 vài trang hoặc 1 vài chục trang), dữ liệu được xuất ra tại Sheet Nhật ký bác ạ. Bác tạo 1 nút bấm và gán code ở #89 vào là chạy được. Nhưng chưa đúng yêu cầu như em đã nói ở #89.
Em không hiểu nút LÊ VĂN em tạo lại không chạy được code, hihì.
Code #89 và file gửi lên không có ăn nhập gì với nhau cả. Chạy còn không được huống chi là "Chạy không đúng yêu cầu".
 
Upvote 0
Code #89 và file gửi lên không có ăn nhập gì với nhau cả. Chạy còn không được huống chi là "Chạy không đúng yêu cầu".
File này thì chắc chạy được khi nhấn nút vàng. Chắc do tôi xóa mất sheet nên code không chạy được!
 

File đính kèm

Upvote 0
Nhờ các Cô chú, anh chị vá các bạn sửa giúp em lỗi: Runtime error "6" Over flow như hình và file đính kèm ạ:

File em muốn lấy dữ liệu từ Sheet Data sang Sheet BC có chọn lọc các cột cho sẵn như trong Module.
Modules:
Mã:
Sub LayDL()
   Dim sArr, dArr, I As Long, k As Long, n As Long, eR As Long
   sArr = Sheets("Data").Range("A4").CurrentRegion.Value
   ReDim dArr(1 To UBound(sArr), 1 To 30)
   Application.ScreenUpdating = False
   For I = 4 To UBound(sArr)
    If sArr(I, 19) <> "" Then
        k = k + 1
        dArr(k, 1) = k
        dArr(k, 1) = sArr(I, 27)
        dArr(k, 2) = sArr(I, 28)
        dArr(k, 3) = sArr(I, 29)
        dArr(k, 4) = sArr(I, 9)
        dArr(k, 5) = "Khach le"
        dArr(k, 6) = ""
        dArr(k, 7) = "Phi dich vu"
        dArr(k, 8) = sArr(I, 21)
        dArr(k, 9) = sArr(I, 19)
        dArr(k, 10) = sArr(I, 22)
        dArr(k, 11) = sArr(I, 30)
        dArr(k, 12) = sArr(I, 7)
        dArr(k, 13) = sArr(I, 5)
     End If
    Next
    Sheet3.Activate
    Range("A2:M" & Range("A" & Rows.Count).End(xlDown).Row).Clear
    If k > 0 Then Range("A2").Resize(k, 17).Value = dArr
    Application.ScreenUpdating = True
 
    For I = 4 To UBound(sArr)
     If sArr(I, 26) <> 0 Then
        n = n + 1
        dArr(n, 1) = n
        dArr(n, 1) = sArr(I, 27)
        dArr(n, 2) = sArr(I, 28)
        dArr(n, 3) = sArr(I, 29)
        dArr(n, 4) = sArr(I, 9)
        dArr(n, 5) = "Khach le"
        dArr(n, 6) = ""
        dArr(n, 7) = "Service Charge"
        dArr(n, 8) = sArr(I, 25)
        dArr(n, 9) = sArr(I, 23)
        dArr(n, 10) = sArr(I, 26)
        dArr(n, 11) = sArr(I, 30)
        dArr(n, 12) = sArr(I, 7)
        dArr(n, 13) = sArr(I, 5)
     End If
    Next
    Sheet3.Activate
    eR = Range("A" & Rows.Count).End(xlUp).Row + 1
    If n > 0 Then Range("A" & eR).Resize(n, 17).Value = dArr
    Application.ScreenUpdating = True
      With Sheet3
            [I:I].Replace What:=" VAT", Replacement:=""
            Sheet3.Activate
            ActiveWindow.DisplayGridlines = False
            [D:D].NumberFormat = "mm/dd/yyyy"
            [H:H,J:J].NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""_);_(@_)"
            eR = Range("A" & Rows.Count).End(xlUp).Row
            [N1] = "Site"
            [N2].Formula = "= M2 & ""_"" & text(month(D2),""0#"")& ""_"" &right(year(D2),2)& ""_"" &Right(A2, 3)"
            Range("N2:N" & eR).FillDown
            With Range("N2:N" & eR)
                .Value = .Value
                [M:M].Delete
                [A1].Select
            End With
        End With
End Sub

Em cảm ơn !
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom