Trợ giúp Sub đánh số tự động Lớp theo chiều sâu trợ giúp mình với nhé.

  • Thread starter Tú_Mỡ
  • Ngày gửi
Trạng thái
Không mở trả lời sau này.
T

Tú_Mỡ

Guest
Bạn cần đăng nhập để thấy hình ảnh

link file :
Nhờ mọi người trợ giúp một sub đánh số Lớp tự động vào cột B theo chiều sâu cột A tham chiếu dữ liệu từ cột D và Cột C.( cột D và C Được hiểu như bảng chú giải)
- Số Dữ liệu cột A (chiều sâu) có thể thay đổi thêm
- Số dữ liệu cột D và E cũng có thể thay đổi thêm (thêm sớp và độ sâu)
- VD: độ sâu 2.0m nằm trong khoảng của lớp 2 (0.5m đến 7.0m)
VD: độ sâu 16.0m nằm trong khoảng của lớp 4c (12.7m đến 22.7m)
Xin cảm ơn mọi người.
 
Sửa lần cuối bởi điều hành viên:
B

bvtvba

Guest
Trên file của bạn thì cột C là cột nào? Hình như không có dữ liệu nào! Bạn có nghĩ rằng khi chụp ảnh minh họa nên để tên các cột A,B,C vào trong ảnh thì dễ hiểu hơn không ạ?
 
T

thanhphong

Guest
Hình ảnh thì nói tham chiếu vào D,E. Còn thuyết minh trong bài viết thì ghi là C,D. Post bài xong, không biết bạn ấy có đọc lại kiểm tra nội dung hay không!
Xin hỏi chủ topic nếu độ sâu là 12.7 thì nó thuộc lớp 4a hay 4c?
Khoảng a,b phải hiểu như thế nào, hãy nói rõ ra:
TH1: a< x < b
TH2: a<= x < b
TH3: a<=x <=b
TH4: a < x <= b
 
T

Tú_Mỡ

Guest
Trên file của bạn thì cột C là cột nào? Hình như không có dữ liệu nào! Bạn có nghĩ rằng khi chụp ảnh minh họa nên để tên các cột A,B,C vào trong ảnh thì dễ hiểu hơn không ạ?
Xin lỗi bạn mình chụp ảnh màn hình mà quên mất cột. mình có up lại ảnh. va sửa cột dữ liệu đó là cột D và E.
 
T

Tú_Mỡ

Guest
Hình ảnh thì nói tham chiếu vào D,E. Còn thuyết minh trong bài viết thì ghi là C,D. Post bài xong, không biết bạn ấy có đọc lại kiểm tra nội dung hay không!
Xin hỏi chủ topic nếu độ sâu là 12.7 thì nó thuộc lớp 4a hay 4c?
Khoảng a,b phải hiểu như thế nào, hãy nói rõ ra:
TH1: a< x < b
TH2: a<= x < b
TH3: a<=x <=b
TH4: a < x <= b
C
Của mình theo TH 3 và ví dụ A1 =20 , 10 <=A1<=20,
20<=A1<=40 thì lấy giá trị A1 là 20, lấy giá trị tiến về phía sâu hơn, tiến về phía 40 bạn à.
 

vbano1

SMod
Thành viên BQT
Bạn cần đăng nhập để thấy hình ảnh


Tôi giúp bạn với tư cách thành viên thông thường.

Đầu tiên ta thống nhất với nhau là dữ liệu cột A,B và D,E đều bắt đầu từ dòng số 2. Vì vậy nếu kiểm tra mà từ dòng thứ 2 trở đi không có dữ liệu ở cột A hoặc cột D thì cho kết thúc.

Từ nội dung đã thảo luận trong topic này cho đến giờ: thì bạn ưu tiên vào các khoảng phía bên phải.
Bạn cần đăng nhập để thấy hình ảnh

Tức là trong trường hợp, nó rơi vào điểm đầu mút thì ưu tiên cho nó rơi vào khoảng bên tay phải. (trong ảnh trên tôi ví dụ 11.5 thì sẽ cho nó rơi vào khoảng 11.5~21.5 thay vì 6.5~11.5).
Và vì dữ liệu trên cột E đang xếp theo thứ tự tăng dần (trường hợp bạn để dữ liệu cột E loạn xạ thì hãy báo lại), cho nên logic của nó là:
chạy từ trái sang phải nếu phát hiện ra x<a thì cho nó rơi vào khoảng đó luôn và kết thúc không xét nữa.
Ví dụ tôi có 6<6.5 thì tôi cho 6 rơi vào khoảng 0~6.5 và không xét gì nữa.

Nhưng bây giờ ta xét tình huống đặc biệt, tôi có giới hạn 33.5 là giới hạn cuối cùng. (Tương tự như dữ liệu demo bạn đưa lên 73.0 là giới hạn cuối cùng).
Bạn cần đăng nhập để thấy hình ảnh

Mong muốn của chúng ta là nó rơi vào khoảng 21.5~33.5
Nhưng khi xét bất đẳng thức x<a chạy từ trái qua phải thì 33.5<33.5 là bất đẳng thức sai. Do đó 33.5 không rơi vào khoảng 21.5~33.5 được nữa.
Nhưng phía sau 33.5 cũng không còn khoảng nào để xét nữa. Vì vậy trong trường hợp đầu mút cuối cùng rất đặc biệt này, ta phải xét đẳng thức x=a có xảy ra hay không, nếu có thì phải cho nó rơi vào khoảng cuối cùng, mà ở đây là 21.5~33.5.
Tất nhiên, xét tới mức đó rồi mà cũng không ra thì kết quả là rỗng.

Ta ví dụ:
Bạn cần đăng nhập để thấy hình ảnh

Trường hợp này thì 35 chẳng rơi vào khoảng nào được cả.
Như vậy code sẽ là:
Mã:
Sub tuhocvba0930()
    Dim i           As Long
    Dim rend        As Long 'Dong cuoi cung cua cot A
    Dim rend2       As Long 'Dong cuoi cung cua cot D
    Dim arr         As Variant 'Du lieu cot A,B
    Dim brr         As Variant 'Du lieu cot D,E
    Const rstart    As Long = 2
    rend = Cells(Rows.Count, 1).End(xlUp).Row
    '1-Kiem tra xem co du lieu tren cot A hay khong
    If rend < rstart Then
        MsgBox "Khong co du lieu tren cot A"
        Exit Sub 'Ket thuc chuong trinh
    End If
    
    
    'Gan gia tri cot A,B cho arr
    arr = Range(Cells(rstart, 1), Cells(rend, 2)).Value
    
    rend2 = Cells(Rows.Count, 4).End(xlUp).Row
    '2-Kiem tra xem co du lieu tren cot D hay khong
    If rend2 < rstart Then
        MsgBox "Khong co du lieu tren cot D"
        Exit Sub 'Ket thuc chuong trinh
    End If
  
    'Gan gia tri cot D,E cho brr
    brr = Range(Cells(rstart, 4), Cells(rend2, 5)).Value
    'Mac dinh cot E da duoc sap xep theo thu tu tang dan
    '3-1: Tim gia tri cho cot B
    'Chay tu dong 2 toi dong cuoi cung
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        arr(i, 2) = timgiatri(Val(CStr(arr(i, 1))), brr)
    Next i
    '3-2: Ghi ket qua:
    Range(Cells(rstart, 1), Cells(rend, 2)).Value = arr
End Sub
Private Function timgiatri(ByVal x As Double, brrtem As Variant) As String
    Dim j   As Long
    For j = LBound(brrtem, 1) To UBound(brrtem, 1) Step 1
        If x < Val(CStr(brrtem(j, 2))) Then
            timgiatri = CStr(brrtem(j, 1))
            Exit Function
        ElseIf j = UBound(brrtem, 1) Then
            If x = Val(CStr(brrtem(j, 2))) Then
                timgiatri = CStr(brrtem(j, 1))  'Diem dau mut cuoi cung
            End If
        End If
        
        
    Next j
    
End Function
Tóm lại, ta thống nhất với nhau những điều trên, đặc biệt là dữ liệu cột E phải được sắp xếp theo thứ tự tăng dần, và macro bạn có thể download ở đây:
 
B

bvtvba

Guest
Tóm lại, ta thống nhất với nhau những điều trên, đặc biệt là dữ liệu cột E phải được sắp xếp theo thứ tự tăng dần, và macro bạn có thể download ở đây:
Code quá nhanh:
Bạn cần đăng nhập để thấy hình ảnh
 
T

Tú_Mỡ

Guest
Bạn cần đăng nhập để thấy hình ảnh


Tôi giúp bạn với tư cách thành viên thông thường.

Đầu tiên ta thống nhất với nhau là dữ liệu cột A,B và D,E đều bắt đầu từ dòng số 2. Vì vậy nếu kiểm tra mà từ dòng thứ 2 trở đi không có dữ liệu ở cột A hoặc cột D thì cho kết thúc.

Từ nội dung đã thảo luận trong topic này cho đến giờ: thì bạn ưu tiên vào các khoảng phía bên phải.
Bạn cần đăng nhập để thấy hình ảnh

Tức là trong trường hợp, nó rơi vào điểm đầu mút thì ưu tiên cho nó rơi vào khoảng bên tay phải. (trong ảnh trên tôi ví dụ 11.5 thì sẽ cho nó rơi vào khoảng 11.5~21.5 thay vì 6.5~11.5).
Và vì dữ liệu trên cột E đang xếp theo thứ tự tăng dần (trường hợp bạn để dữ liệu cột E loạn xạ thì hãy báo lại), cho nên logic của nó là:
chạy từ trái sang phải nếu phát hiện ra x<a thì cho nó rơi vào khoảng đó luôn và kết thúc không xét nữa.
Ví dụ tôi có 6<6.5 thì tôi cho 6 rơi vào khoảng 0~6.5 và không xét gì nữa.

Nhưng bây giờ ta xét tình huống đặc biệt, tôi có giới hạn 33.5 là giới hạn cuối cùng. (Tương tự như dữ liệu demo bạn đưa lên 73.0 là giới hạn cuối cùng).
Bạn cần đăng nhập để thấy hình ảnh

Mong muốn của chúng ta là nó rơi vào khoảng 21.5~33.5
Nhưng khi xét bất đẳng thức x<a chạy từ trái qua phải thì 33.5<33.5 là bất đẳng thức sai. Do đó 33.5 không rơi vào khoảng 21.5~33.5 được nữa.
Nhưng phía sau 33.5 cũng không còn khoảng nào để xét nữa. Vì vậy trong trường hợp đầu mút cuối cùng rất đặc biệt này, ta phải xét đẳng thức x=a có xảy ra hay không, nếu có thì phải cho nó rơi vào khoảng cuối cùng, mà ở đây là 21.5~33.5.
Tất nhiên, xét tới mức đó rồi mà cũng không ra thì kết quả là rỗng.

Ta ví dụ:
Bạn cần đăng nhập để thấy hình ảnh

Trường hợp này thì 35 chẳng rơi vào khoảng nào được cả.
Như vậy code sẽ là:
Mã:
Sub tuhocvba0930()
    Dim i           As Long
    Dim rend        As Long 'Dong cuoi cung cua cot A
    Dim rend2       As Long 'Dong cuoi cung cua cot D
    Dim arr         As Variant 'Du lieu cot A,B
    Dim brr         As Variant 'Du lieu cot D,E
    Const rstart    As Long = 2
    rend = Cells(Rows.Count, 1).End(xlUp).Row
    '1-Kiem tra xem co du lieu tren cot A hay khong
    If rend < rstart Then
        MsgBox "Khong co du lieu tren cot A"
        Exit Sub 'Ket thuc chuong trinh
    End If
   
   
    'Gan gia tri cot A,B cho arr
    arr = Range(Cells(rstart, 1), Cells(rend, 2)).Value
   
    rend2 = Cells(Rows.Count, 4).End(xlUp).Row
    '2-Kiem tra xem co du lieu tren cot D hay khong
    If rend2 < rstart Then
        MsgBox "Khong co du lieu tren cot D"
        Exit Sub 'Ket thuc chuong trinh
    End If
 
    'Gan gia tri cot D,E cho brr
    brr = Range(Cells(rstart, 4), Cells(rend2, 5)).Value
    'Mac dinh cot E da duoc sap xep theo thu tu tang dan
    '3-1: Tim gia tri cho cot B
    'Chay tu dong 2 toi dong cuoi cung
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        arr(i, 2) = timgiatri(Val(CStr(arr(i, 1))), brr)
    Next i
    '3-2: Ghi ket qua:
    Range(Cells(rstart, 1), Cells(rend, 2)).Value = arr
End Sub
Private Function timgiatri(ByVal x As Double, brrtem As Variant) As String
    Dim j   As Long
    For j = LBound(brrtem, 1) To UBound(brrtem, 1) Step 1
        If x < Val(CStr(brrtem(j, 2))) Then
            timgiatri = CStr(brrtem(j, 1))
            Exit Function
        ElseIf j = UBound(brrtem, 1) Then
            If x = Val(CStr(brrtem(j, 2))) Then
                timgiatri = CStr(brrtem(j, 1))  'Diem dau mut cuoi cung
            End If
        End If
       
       
    Next j
   
End Function
Tóm lại, ta thống nhất với nhau những điều trên, đặc biệt là dữ liệu cột E phải được sắp xếp theo thứ tự tăng dần, và macro bạn có thể download ở đây:
Trước tiên xin cảm ơn @vbano1 Sub đúng với ý mình rồi, mình cũng tập tọe viết nhưng mà mới chỉ được một vế điền vào cột B bằng if ....else sơ đẳng nhưng chưa chưa tìm cách để lọc được điều kiện khi chiều sâu đáy lớp thay đổi (cột E), (cột E là cột chiều sâu đáy lỗ khoan nên bắt buộc độ sâu nó phải tăng dần.) mình sẽ sửa tiếp cái của mình xem. một lần nữa xin cảm ơn @vbano1 nhé. Chúc bạn và các admin một buổi tối vui vẻ.
 

tuhocvba

Administrator
Thành viên BQT
Logic rõ ràng rồi mà.
Bạn cần đăng nhập để thấy đính kèm
 
T

thanhphong

Guest
Trước tiên xin cảm ơn @vbano1 Sub đúng với ý mình rồi, mình cũng tập tọe viết nhưng mà mới chỉ được một vế điền vào cột B bằng if ....else sơ đẳng nhưng chưa chưa tìm cách để lọc được điều kiện khi chiều sâu đáy lớp thay đổi (cột E), (cột E là cột chiều sâu đáy lỗ khoan nên bắt buộc độ sâu nó phải tăng dần.) mình sẽ sửa tiếp cái của mình xem. một lần nữa xin cảm ơn @vbano1 nhé. Chúc bạn và các admin một buổi tối vui vẻ.
1. Nếu bạn muốn thảo luận tại sao code của bạn chạy không được thì đưa code lên.
2. Nếu đã nhờ người khác, họ code đúng, thì cảm ơn, thế thôi. Theo cách nói của bạn thì cứ có cảm giác rằng: À, code thì đúng đấy, nhưng tôi vẫn muốn tự code và dùng cái code mà tôi tự code ấy.
Nếu như muốn mình tự code, thì hãy tự code. Khi nào code không nổi nữa thì hãy nhờ. Và khi đã nhờ thì cám ơn, thế thôi, đừng nói lan man vấn đề khác.
 
T

Tú_Mỡ

Guest
Logic rõ ràng rồi mà.
Bạn cần đăng nhập để thấy đính kèm
Bạn cần đăng nhập để thấy hình ảnh

Cảm ơn các admin đã quan tâm đến mình , giờ mình xem lại thì thì các giá trị đánh vào chiều sâu lớp 6.1-6.9 thì ô B4 nó vẫn bị nhận là giá trị lớp 2
Có thể mình trình bày lần trước như trong ô vuông màu đỏ khoanh tròn thì các bạn hiểu. (giả sử độ sâu 2.0-4.0-6.0 nằm trong lớp 2 (0.5m-6.5m). độ sâu 22.7m thì được tính cho vào lớp 6a tiến về phía sau.....) đã thử thêm độ sâu đánh lớp, độ sâu đáy lớp thì đã oke..giờ nhờ admin có thể chỉnh sửa code lại giúp mình được ko vậy. thanks admin
 
T

Tú_Mỡ

Guest
1. Nếu bạn muốn thảo luận tại sao code của bạn chạy không được thì đưa code lên.
2. Nếu đã nhờ người khác, họ code đúng, thì cảm ơn, thế thôi. Theo cách nói của bạn thì cứ có cảm giác rằng: À, code thì đúng đấy, nhưng tôi vẫn muốn tự code và dùng cái code mà tôi tự code ấy.
Nếu như muốn mình tự code, thì hãy tự code. Khi nào code không nổi nữa thì hãy nhờ. Và khi đã nhờ thì cám ơn, thế thôi, đừng nói lan man vấn đề khác.
Mình nhờ trước khi mình tập viết code. vì thực ra nó chưa xong và trông cái code nó ko khoa học cho lắm. nên mình mới bảo đang chỉ viết được một vế, còn vế còn lại viết thuật toán về mảng, biến chạy. logic thì mình chưa viết được chưa thực sự hiểu nên chỉ viết vế đầu nó như một hàm if trong excell. mình còn đang học hỏi nhiều. còn mình nhờ ai chưa bao giờ không cảm ơn người giúp, nhưng ko thể mỗi lần trả lời lại một lần cảm ơn. .....Cảm ơn bạn đã góp ý mình.
 

tuhocvba

Administrator
Thành viên BQT
Tôi thú thật là không hiểu bạn nói gì.
Sai thì sai ở đâu?
Hiện trạng sai là gì? Giá trị mong muốn là gì?

các giá trị đánh vào chiều sâu lớp 6.1-6.9 thì ô B4 nó vẫn bị nhận là giá trị lớp 2
giá trị ở ô A4 là 6.0 chứ có phải nằm trong khoảng 6.1-6.9 đâu.
Vậy, cái câu nói của bạn "giá trị đánh vào 6.1-6.9" nó được thể hiện ở đâu? chỗ nào?

Ô B4 là lớp 2 là đúng hay sai? Tại sao hình ảnh bạn đưa lại thể hiện là 4a? Cái này bạn tự gõ tay "4a" vào à? Nếu tự gõ "4a" thì lý do là gì?
 
B

bvtvba

Guest
Cái này là cái gì vậy chủ topic?
Bạn cần đăng nhập để thấy hình ảnh


INPUT mà chủ topic nói là chỉ nằm trên cột D,E và A. Tại sao lại có cái vùng dữ liệu đỏ lòe loẹt trải dài từ cột G tới cột V? Cái này là cái gì? Là nháp hay input?
Nếu là nháp, thì cái bạn muốn nói là gì?

31.7 thuộc lớp 8a là sai? Vậy đúng là phải thuộc lớp bao nhiêu? Lý do?
Hãy trình bày rõ ràng ra, sai là cái gì sai? giá trị kỳ vọng của nó khi ấy là gì? Trong công ty, bạn không phải báo cáo với cấp trên bao giờ à mà trình bày lôi thôi không ai hiểu gì thế này?
 

vbano1

SMod
Thành viên BQT
Đọc cả bài viết hoàn toàn không hiểu gì. Code đang sai ở đâu? Cái bạn muốn là gì?
sâu 22.7m thì được tính cho vào lớp 6a tiến về phía sau.....) đã thử thêm độ sâu đánh lớp, độ sâu đáy lớp thì đã oke..giờ nhờ admin có thể chỉnh sửa code lại giúp mình được ko vậy. thanks admin
Đã OK thì tại sao lại phải sửa? Sửa cái gì? Cái gì sai? Sai ở đâu? Lý do: Giá trị kỳ vọng ở đó là gì?
Tôi không biết độ sâu đánh lớp với đáy lớp là cái gì-đó là chuyên môn của bạn. Hãy tránh sử dụng các từ ngữ chuyên môn của bản thân, hãy dùng ngôn từ dễ hiểu, để bất cứ ai cũng hiểu được.
 

tuhocvba

Administrator
Thành viên BQT
Topic này bị khóa vì:
1. Đối chiếu với yêu cầu được thuyết minh ở bài viết #1 thì topic này đã được hỗ trợ, đạt yêu cầu mà bài viết #1 đưa ra.
2. Không khí topic không đảm bảo để thảo luận học thuật, các thành viên bất mãn và gửi Report báo cáo xấu về chủ topic: Trình bày khó hiểu, gây mất thời gian của người khác.
3. Đã tiến hành kỷ luật, xóa nick chủ topic khỏi diễn đàn. Trước khi học VBA, hãy nâng cao khả năng diễn đạt trước đã.
Diễn đàn không chào đón những người trình bày khó hiểu.
 
Trạng thái
Không mở trả lời sau này.
Top