Dò tìm 2 chiều để tạo biểu đồ tiến độ (1 người xem)

Liên hệ QC

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

baggiotung

Thành viên mới
Tham gia
16/10/09
Bài viết
32
Được thích
7
Mình có file như ở dưới với 2 sheet: Sheet "nhập dữ liệu" và sheet "tiến độ". Yêu cầu của bài là dò tìm dữ liệu ở các cột 1,2,3,4 sheet du lieu để điền vào sheet tiến độ. Mình đã điền ví dụ dữ liệu bằng thủ công từ sheet "nhập dữ liệu" ở hàng 5 và hàng 13 lên bảng tiến độ ở sheet "tiến độ" rồi. Mình nhờ các anh chị dùng vba để chạy nốt dữ liệu còn lại. Xin chân thành cám ơn.
hoi_GPE.png
 

File đính kèm

Mình có file như ở dưới với 2 sheet: Sheet "nhập dữ liệu" và sheet "tiến độ". Yêu cầu của bài là dò tìm dữ liệu ở các cột 1,2,3,4 sheet du lieu để điền vào sheet tiến độ. Mình đã điền ví dụ dữ liệu bằng thủ công từ sheet "nhập dữ liệu" ở hàng 5 và hàng 13 lên bảng tiến độ ở sheet "tiến độ" rồi. Mình nhờ các anh chị dùng vba để chạy nốt dữ liệu còn lại. Xin chân thành cám ơn.
View attachment 264255
Bạn nhấn nút RUN và kiểm tra kết quả nhé. Mình không có thời gian kiểm tra.
 

File đính kèm

Bạn nhấn nút RUN và kiểm tra kết quả nhé. Mình không có thời gian kiểm tra.
Cám ơn bạn đã quan tâm và trả lời nhưng có 2 điều rất mong bạn giúp tiếp
1. Code bạn viết chỉ chạy 1 cột B ở sheet dữ liệu (Cột C chưa thể hiện trên biểu tiến độ)
2. Mình muốn nối luôn đoạn giữa 2 giá trị (cột B và C) trên biểu đồ thì làm cách nào bạn?
 

File đính kèm

Cám ơn bạn đã quan tâm và trả lời nhưng có 2 điều rất mong bạn giúp tiếp
1. Code bạn viết chỉ chạy 1 cột B ở sheet dữ liệu (Cột C chưa thể hiện trên biểu tiến độ)
2. Mình muốn nối luôn đoạn giữa 2 giá trị (cột B và C) trên biểu đồ thì làm cách nào bạn?
1.Do tiến độ của Sh TIEN DO cách nhau 500 m do vậy ta tìm điểm xuất phát để tìm ra lần SCTX
Dữ liệu trên cột C của Sh Nhap DL có nhiều ô trùng nhau, lấy lần SCTX nào ( ví dụ C5=758000; G5=1 và C12=758000; G12=2.......) thì lấy G5 hay G12.
2. Bạn thử thêm đoạn code : KQ(k, i + 1) = .Cells(dong, 7) vào dưới đoạn KQ(k, i ) = .Cells(dong, 7) xem thế nào. Ở đoạn khai báo Redim KQ (........to Ubound(arr,2)+1); kết quả trả về .....resize(12,Ubound(arr,2)+1)
 
1.Do tiến độ của Sh TIEN DO cách nhau 500 m do vậy ta tìm điểm xuất phát để tìm ra lần SCTX
Dữ liệu trên cột C của Sh Nhap DL có nhiều ô trùng nhau, lấy lần SCTX nào ( ví dụ C5=758000; G5=1 và C12=758000; G12=2.......) thì lấy G5 hay G12.
2. Bạn thử thêm đoạn code : KQ(k, i + 1) = .Cells(dong, 7) vào dưới đoạn KQ(k, i ) = .Cells(dong, 7) xem thế nào. Ở đoạn khai báo Redim KQ (........to Ubound(arr,2)+1); kết quả trả về .....resize(12,Ubound(arr,2)+1)
1. Lấy cả 2 lần vì trùng lý trình sẽ khác tháng thi công nên trên biểu đồ sẽ thể hiện cả 2
2. Sẽ thêm đoạn code vào để thử và học
3. Cám ơn và chúc sức khỏe mùa dịch nha
 
1.Do tiến độ của Sh TIEN DO cách nhau 500 m do vậy ta tìm điểm xuất phát để tìm ra lần SCTX
Dữ liệu trên cột C của Sh Nhap DL có nhiều ô trùng nhau, lấy lần SCTX nào ( ví dụ C5=758000; G5=1 và C12=758000; G12=2.......) thì lấy G5 hay G12.
2. Bạn thử thêm đoạn code : KQ(k, i + 1) = .Cells(dong, 7) vào dưới đoạn KQ(k, i ) = .Cells(dong, 7) xem thế nào. Ở đoạn khai báo Redim KQ (........to Ubound(arr,2)+1); kết quả trả về .....resize(12,Ubound(arr,2)+1)
đoạn code trên đã nối được trên biểu đồ, bạn giúp luôn thể hiện cả 2 lần duy tu 1 và 2 trên biểu đồ là hoàn thành ha. :p :p :p
 

File đính kèm

File đính kèm

Thấy sao làm vậy không biết 1, 2 là gì. Bạn kiểm tra "bằng mắt" xem sao.
Cám ơn anh bate. Code anh chạy rất tốt và e ko hiểu luôn :(:(, chỉ biết là anh lấy đoạn giá trị giữa 2 cột để điền. Chính vì vậy nên sai 1 dòng duy nhất là dòng 127, 128 ơ sheet "data". Chính vì đoạn này đặc biệt (nói nôm na là 1 con đường khác với tuyến đường. Đây chính là đoạn tam giác của tuyến đường sắt thống nhất qua TP Đà Nẵng. Hì) nên phải bôi vàng ở tiến độ. Có cách nào để làm duy nhất cho đoạn đó không a? Cám ơn anh. Mình gởi hình kèm file mong anh giúp nốt. nếu được bate ghi chú giải thích từng dòng code cho mình họcđược không?
bate1.png
bate2.png
 

File đính kèm

Lần chỉnh sửa cuối:
đoạn code trên đã nối được trên biểu đồ, bạn giúp luôn thể hiện cả 2 lần duy tu 1 và 2 trên biểu đồ là hoàn thành ha. :p :p :p
Của bạn đây. Tự kiểm tra độ chính xác nhé.
Tự cảm thấy Code lòng vòng và chưa gọn, củ chuối quá. anh chị em nào ghé qua xem và cho ý kiến nhé
Mã:
Sub TIENDO()
Dim i As Long, lr As Long, dong&, dong1&, k&
Dim Arr(), KQ()
    With Sheet2
    lr = .Range("B65000").End(xlUp).Row
     Set Rng = .Range("B5:B" & lr)
     Arr = Sheet1.Range("F10:KM10").Value
     ReDim KQ(1 To 12, 1 To UBound(Arr, 2))
 '    On Error Resume Next
        For i = 1 To UBound(Arr, 2)
            Set tim = Rng.Find(Arr(1, i))
            If Not tim Is Nothing Then
                dong = tim.Row
                Do
                        k = Right(.Cells(dong, 6), 2)
                        KQ(k, i) = .Cells(dong, 7)
                        KQ(k, i + 1) = .Cells(dong, 7)
                    Set tim = Rng.FindNext(tim)
                        If Not tim Is Nothing Then
                            dong1 = tim.Row
                            k = Right(.Cells(dong1, 6), 2)
                            KQ(k, i) = .Cells(dong1, 7)
                            KQ(k, i + 1) = .Cells(dong1, 7)
                        End If
                Loop While Not tim Is Nothing And tim.Row <> dong
            End If
        Next i
    End With
    
    Sheet1.[F11].Resize(12, UBound(Arr, 2)).ClearContents
    Sheet1.[F11].Resize(12, UBound(Arr, 2) + 1) = KQ
    Set Rng = Nothing: Set tim = Nothing
End Sub
 

File đính kèm

Của bạn đây. Tự kiểm tra độ chính xác nhé.
Tự cảm thấy Code lòng vòng và chưa gọn, củ chuối quá. anh chị em nào ghé qua xem và cho ý kiến nhé
Mã:
Sub TIENDO()
Dim i As Long, lr As Long, dong&, dong1&, k&
Dim Arr(), KQ()
    With Sheet2
    lr = .Range("B65000").End(xlUp).Row
     Set Rng = .Range("B5:B" & lr)
     Arr = Sheet1.Range("F10:KM10").Value
     ReDim KQ(1 To 12, 1 To UBound(Arr, 2))
 '    On Error Resume Next
        For i = 1 To UBound(Arr, 2)
            Set tim = Rng.Find(Arr(1, i))
            If Not tim Is Nothing Then
                dong = tim.Row
                Do
                        k = Right(.Cells(dong, 6), 2)
                        KQ(k, i) = .Cells(dong, 7)
                        KQ(k, i + 1) = .Cells(dong, 7)
                    Set tim = Rng.FindNext(tim)
                        If Not tim Is Nothing Then
                            dong1 = tim.Row
                            k = Right(.Cells(dong1, 6), 2)
                            KQ(k, i) = .Cells(dong1, 7)
                            KQ(k, i + 1) = .Cells(dong1, 7)
                        End If
                Loop While Not tim Is Nothing And tim.Row <> dong
            End If
        Next i
    End With
  
    Sheet1.[F11].Resize(12, UBound(Arr, 2)).ClearContents
    Sheet1.[F11].Resize(12, UBound(Arr, 2) + 1) = KQ
    Set Rng = Nothing: Set tim = Nothing
End Sub
Đã chạy kiểm tra file tình hình là lý trình cột C ở sheet du lieu vẫn chưa có mặt trên biểu đồ.
Đối với người mới lõm bõm code như mình thì đây là củ chuối pro :clap::clap::clap:
 
Lần chỉnh sửa cuối:
Đã chạy kiểm tra file tình hình là lý trình cột C ở sheet du lieu vẫn chưa có mặt trên biểu đồ.
Đối với người mới lõm bõm code như mình thì đây là củ chuối pro :clap::clap::clap:
Để lý trình cột C có trên biểu đồ thì bạn thay đoạn code Set Rng = .Range("B5:B" & lr) bằng đoạn code Set Rng = .Range("B5:C" & lr), khi đó tim= Rng(find(arr(1,i)) sẽ tìm cả ở cột B và cột C của Sh Nhập DL
với lại cột B và cột C của sh Nhập DL cách nhau một khoảng 1000m trong vậy có cần thiết dòng tiến độ phải chia nhỏ ra cách nhau 500m không? Chẳng lẽ nhập DL từ xxx000 đến yyy000 tháng n và SCTX lần 1 hoặc 2, chứ có thấy xxx000 đến xxx500 tháng n ,SCTX lần 1 và xxx500 đến yyy000 tháng m SCTX lần 2 đâu? hay nói cách khác là trong 1000m ấy không có sự biến động của tháng (liên quan đến 2 tháng) và lần SCTX (nủa km đầu lần 1 và nửa km sau thì lần 2). Do vậy theo tôi trong dòng lý trình tiếnđộ bạn chỉ nên để chẵn số km (ví dụ F(n) là xxx000,F(n+1) là yyy000) thì vẫn theo dõi được tiến độ. trong trường hợp có biếnđộng như trên thì trên Sh nhập liệu cũng sẽ phản ánh được và có thể có thêmđoạn codeđể tựđộng nhập lý trình từ Sh DL sang sh Tiếnđộ.
Chúc vui, khỏe, chiến thắng đại dịch.
 
Để lý trình cột C có trên biểu đồ thì bạn thay đoạn code Set Rng = .Range("B5:B" & lr) bằng đoạn code Set Rng = .Range("B5:C" & lr), khi đó tim= Rng(find(arr(1,i)) sẽ tìm cả ở cột B và cột C của Sh Nhập DL
với lại cột B và cột C của sh Nhập DL cách nhau một khoảng 1000m trong vậy có cần thiết dòng tiến độ phải chia nhỏ ra cách nhau 500m không? Chẳng lẽ nhập DL từ xxx000 đến yyy000 tháng n và SCTX lần 1 hoặc 2, chứ có thấy xxx000 đến xxx500 tháng n ,SCTX lần 1 và xxx500 đến yyy000 tháng m SCTX lần 2 đâu? hay nói cách khác là trong 1000m ấy không có sự biến động của tháng (liên quan đến 2 tháng) và lần SCTX (nủa km đầu lần 1 và nửa km sau thì lần 2). Do vậy theo tôi trong dòng lý trình tiếnđộ bạn chỉ nên để chẵn số km (ví dụ F(n) là xxx000,F(n+1) là yyy000) thì vẫn theo dõi được tiến độ. trong trường hợp có biếnđộng như trên thì trên Sh nhập liệu cũng sẽ phản ánh được và có thể có thêmđoạn codeđể tựđộng nhập lý trình từ Sh DL sang sh Tiếnđộ.
Chúc vui, khỏe, chiến thắng đại dịch.
Rất cám ơn sự nhiệt tình của bạn @HUONGHCKT . Khi chuyển Set Rng = .Range("B5:B" & lr) bằng đoạn code Set Rng = .Range("B5:C" & lr) thì dòng code nối các cột KQ(k, i + 1) = .Cells(dong, 7) bị lỗi, mình sẽ nghiên cứu thêm chút để hoàn thiện
Về Lý trình vì sao có đoạn 500 ở giữa thì như sau: Có những đơn vị thi công không chẵn hoặc hơn 1000 ví dụ từ Km xxx+300 đến Km xxx+400. Thì khi trình bày tiến độ phải đi qua Km đó. Nên mình ẩn đoạn +500 thì biểu đồ sẽ hiển thị chẵn Km và rơi vào giữa để người ta hiểu là thi công ở lưng chừng (ko nhất thiết là 500,400,600).
Vì lý trình Km quản lý là cố định nên mình cố định luôn thì vẫn ổn cho việc trình bày tổng thể. Việc tự động điền LT từ sheet dữ liệu qua sheet tiến độ rất hay nhưng mà thú thật mình không đủ trình độ làm như các anh chị vì khi đó cột tiến độ ko còn cố định nữa.
 
Cám ơn anh bate. Code anh chạy rất tốt và e ko hiểu luôn :(:(, chỉ biết là anh lấy đoạn giá trị giữa 2 cột để điền. Chính vì vậy nên sai 1 dòng duy nhất là dòng 127, 128 ơ sheet "data". Chính vì đoạn này đặc biệt (nói nôm na là 1 con đường khác với tuyến đường. Đây chính là đoạn tam giác của tuyến đường sắt thống nhất qua TP Đà Nẵng. Hì) nên phải bôi vàng ở tiến độ. Có cách nào để làm duy nhất cho đoạn đó không a? Cám ơn anh. Mình gởi hình kèm file mong anh giúp nốt. nếu được bate ghi chú giải thích từng dòng code cho mình họcđược không?
View attachment 264281
View attachment 264282
Sai vì sao? Kết quả đúng là thế nào? Công việc của bạn chỉ mình bạn rõ, người khác (trên GPE này) đâu phải ai cũng hiểu được chuyên môn của bạn.
Ví dụ, bạn phải ghi rõ dòng đó sai vì đâu? Làm duy nhất là sao? Đã lấy dữ liệu cho kết quả cột này này rồi, không lấy cho cột khác nữa? hay gì gì đó để người khác hiểu. Hoặc là sai là vì lấy kết quả cho cột này , đúng ra phải ghi kết quả vào cột này này...
Chụp hình hoặc đưa kết quả đúng mà bạn muốn có kèm giải thích.
 
Lần chỉnh sửa cuối:
Sai vì sao? Kết quả đúng là thế nào? Công việc của bạn chỉ mình bạn rõ, người khác (trên GPE này) đâu phải ai cũng hiểu được chuyên môn của bạn.
Ví dụ, bạn phải ghi rõ dòng đó sai vì đâu? Làm duy nhất là sao? Đã lấy dữ liệu cho kết quả cột này này rồi, không lấy cho cột khác nữa? hay gì gì đó để người khác hiểu. Hoặc là sai là vì lấy kết quả cho cột này , đúng ra phải ghi kết quả vào cột này này...
Chụp hình hoặc đưa kết quả đúng mà bạn muốn có kèm giải thích.

Đúng là như hình anh Ba Tê nha, đoạn 787+677 đến đoạn 793+451; đoạn 791+000 đến 791+758 chỉ tô 2 cột đó thôi chứ ko tô tràn qua các cột khác. Chạy code của anh ở trên nó sẽ tô tràn như hình mình đã gửi trước đó
bate4.png
 
Rất cám ơn sự nhiệt tình của bạn @HUONGHCKT . Khi chuyển Set Rng = .Range("B5:B" & lr) bằng đoạn code Set Rng = .Range("B5:C" & lr) thì dòng code nối các cột KQ(k, i + 1) = .Cells(dong, 7) bị lỗi, mình sẽ nghiên cứu thêm chút để hoàn thiện
Về Lý trình vì sao có đoạn 500 ở giữa thì như sau: Có những đơn vị thi công không chẵn hoặc hơn 1000 ví dụ từ Km xxx+300 đến Km xxx+400. Thì khi trình bày tiến độ phải đi qua Km đó. Nên mình ẩn đoạn +500 thì biểu đồ sẽ hiển thị chẵn Km và rơi vào giữa để người ta hiểu là thi công ở lưng chừng (ko nhất thiết là 500,400,600).
Vì lý trình Km quản lý là cố định nên mình cố định luôn thì vẫn ổn cho việc trình bày tổng thể. Việc tự động điền LT từ sheet dữ liệu qua sheet tiến độ rất hay nhưng mà thú thật mình không đủ trình độ làm như các anh chị vì khi đó cột tiến độ ko còn cố định nữa.
Dòng KQ(k,i+1)=.Cells(dong,7) để Xác định (lần 1 hoặc 2 SCTX) khi chay code sẽ xác định thừa 500 m sau yyy000. Bạn thử vô hiệu dòng code KQ(k,i+1)=.Cells(dong,7) và chạy code sẽ thấy là lý trình cột C của sh DL cũng đã được tim kiếm và cho ra kết quả. Tuy nhiên khoảng xxx+500 sẽ không được xác định là 1 hoặc 2.
 
Web KT

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

Back
Top Bottom