Hàm Dvalue bị giới hạn dung lượng đối tượng cần diễn giải

Liên hệ QC

Phan Thanh Quang

Thành viên hoạt động
Tham gia
6/10/17
Bài viết
120
Được thích
17
Giới tính
Nam
Kính chào anh chị em trên diễn đàn. Hàm Dvalue rất hiệu quả đối với các anh em kỹ sư cơ điện MEP như chúng tôi khi cần trả giá trị số học của 1 biểu thức diễn giải khối lượng. Vấn đề hàm Dvalue trên diễn đàn tôi đã tìm, tuy nhiên vẫn không khắc phục được lỗi ở file cụ thể của tôi.
1. Đoạn thông tin diễn giải của tôi như sau:
(4.000+0.965+3.550+3.550+0.200*9+4.000+0.200+4.000+3.550+0.200+4.000+3.550+0.200+4.000+0.200+4.000+3.550+0.200+0.200+4.000+4.000+3.700+3.552+3.552+3.550+0.200+0.200+0.200+0.200+4.000+3.550+4.000+3.550+4.000+3.550+4.000+3.550+0.200+0.200+0.200+0.200+3.500+3.500+3.500+0.200+0.200+4.000+3.550+4.000+3.550+0.200+0.200+3.500+0.200+2.600+4.000+0.200+0.950+1.460+1.660+1.270+1.460+2.600+0.200+4.000+0.200+0.200+4.000+0.200+0.200+0.200+4.000+4.000+0.200+0.200+4.000+0.200+0.200+0.200+0.200+4.000+4.000+0.200+0.200+4.000+0.200+4.000+0.200+4.000+0.200+1.900+1.140+0.337+0.450+0.450+4.000+0.200+4.000+0.200+0.200+4.000+0.200+4.000+4.000+0.200+4.000+0.200+0.200+4.000+0.200+0.200+4.000+0.200+4.000+2.355+4.330+2.165+0.380+0.381+0.200+0.200+1.500+2.000+4.021+1.500+2.000+3.000+0.200*8+0.55*64+1*17.000)
Với lượng thông tin lớn như vậy, giá trị mà hàm trả là #Dvalue. Khi tôi giảm lượng thông tin ở ô diễn giải còn khoảng 2/3 thì hàm trả được giá trị. Như vậy đoạn code bị khống chế bởi lượng thông tin đưa vào. Anh chị em có thể chỉnh code hàm Dvalue để hàm hiểu và nhận dạng được tham số nó lớn hơn được không ạ. Có thể sau này có những đoạn diễn giải, lượng thông tin đưa vào nhiều hơn như ở ví dụ ở trên.
2. Khi sử dụng code này ở trên máy của tôi thì đọc được, nhưng khi chuyển sang máy tính khác bị lỗi #name, anh chị có thể khắc phục cho tôi điều này được không.
Nếu chỉnh được, nhờ anh chị em gửi mail giúp tôi: thanhquang.phthinh@gmail.comquangpt@xuanmaicorp.vn
Cảm ơn anh chị em, kính chúc sức khỏe!
 

File đính kèm

  • DValue.xla
    42.5 KB · Đọc: 67
Nếu quy luật phép Toán của bạn luôn luôn như ví dụ trên thì tạm có một cách:
Cắt chuỗi đó thành những đoạn <= 255 ký tự bởi dấu "+" gần chỗ 255 nhất.
Cho vào hàm Evaluate() tính từng đoạn đó, cuối cùng cộng chúng lại.
 
Nếu quy luật phép Toán của bạn luôn luôn như ví dụ trên thì tạm có một cách:
Cắt chuỗi đó thành những đoạn <= 255 ký tự bởi dấu "+" gần chỗ 255 nhất.
Cho vào hàm Evaluate() tính từng đoạn đó, cuối cùng cộng chúng lại.
Em chưa hiểu ý anh Be lắm ạ. Em gửi cái file cụ thể của em lên nhờ ngó và xly hộ em.
Trong file em làm theo bác Ba te, em có sử dụng 1 đoạn code của bác ấy theo topic: https://www.giaiphapexcel.com/diend...ờ-cao-thủ-chỉ-giáo-giúp-ạ.136020/#post-867130
File em gửi đây, đã đưa đoạn mã code nào vào trực tiếp trong file để sang máy tính nào cũng đọc được rồi (giải quyết câu hỏi số 2 của em ở trên). Còn câu 1 em vẫn đang bó tay. Điển hình sheet dữ liệu này của em up lên a nghiên cứu giúp. 1 file của em có tới hàng chục sheet dữ liệu, mỗi sheet nó tới hàng trăm hàng ngàn dòng và dự án của em có tới 5 file như vậy (em làm cơ điện).
Ngoài ra, anh có link topic nào có add-ins đếm số lượng ký tự từng ô không anh, em search trên diễn đàn chưa thấy.
 

File đính kèm

  • 181228-Khoi luong PCCC.xls
    317 KB · Đọc: 37
@Phan Thanh Quang
Quy tắc bạn nhập chuỗi tại cột E; G; I là như thế nào?
Cụ thể là bạn dùng những phép tính nào trong đó
Chuỗi dữ liệu các cột E, G, I có 2 cách nhập anh ạ
1. Cũng sử dụng Add-in lấy dữ liệu từ bản vẽ cad sang;
2. Anh em bảo vệ khối lượng nhập tay từ bản vẽ giấy;
3. Các phép tính của em chủ yếu là cộng (+), trừ (-), nhân (*) và chia (/).
Như phân tích của bác Be ở trên, em hiểu bản chất vấn đề do chuỗi dữ liệu của em vượt 255 ký tự nên hàm không hiểu (em đã dùng hàm Len để tính, chuỗi dữ liệu tại ô A19 cả khoảng trắng là 682 ký tự). Do vậy em muốn nhờ các anh chỉnh code để hàm đọc được dữ liệu >255 ký tự ạ.
 
Chuỗi dữ liệu các cột E, G, I có 2 cách nhập anh ạ
1. Cũng sử dụng Add-in lấy dữ liệu từ bản vẽ cad sang;
2. Anh em bảo vệ khối lượng nhập tay từ bản vẽ giấy;
3. Các phép tính của em chủ yếu là cộng (+), trừ (-), nhân (*) và chia (/).
Như phân tích của bác Be ở trên, em hiểu bản chất vấn đề do chuỗi dữ liệu của em vượt 255 ký tự nên hàm không hiểu (em đã dùng hàm Len để tính, chuỗi dữ liệu tại ô A19 cả khoảng trắng là 682 ký tự). Do vậy em muốn nhờ các anh chỉnh code để hàm đọc được dữ liệu >255 ký tự ạ.
Bài này phức tạp hơn tôi nghĩ ban đầu.
Có lẽ các thành viên khác sẽ hỗ trợ giúp bạn.
Sorry!
Thân chào!
 
Nếu sử dụng Evaluate và chia nhỏ chuỗi theo gợi ý của bi phèn thì có hàm sau:

PHP:
Public Function TinhChuoi(ByVal MyStr As String) As Double
TinhChuoi = Evaluate(Replace(MyStr, ",", "."))
End Function
'--------------------------//
Function Tinhchuoi2(MyStr As String) As Double
Dim Ln As Long, Tmp As Double, Vitri As Long, RestStr As String, CalStr As String
CalStr = MyStr: Ln = Len(CalStr)
If Ln < 255 Then
    Tinhchuoi2 = TinhChuoi(CalStr): Exit Function
Else
  
    Vitri = InStr(230, CalStr, "+")
    RestStr = Right(CalStr, Ln - Vitri)
    Tmp = TinhChuoi(Left(CalStr, Vitri - 1))
    Tinhchuoi2 = Tinhchuoi2(Tmp & "+" & RestStr)
End If
End Function
Nếu chuỗi có dạng ( ..............)/1000 thì dùng hàm tinhchuỏi3:

PHP:
Function Tinhchuoi3(MyStr As String) As Double
Dim CalStr As String
If InStr(1, MyStr, "(") = 0 Then
    Tinhchuoi3 = Tinhchuoi2(MyStr)
Else
    CalStr = Replace(Replace(MyStr, "(", ""), ")/1000", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 1000
End If
End Function

Nếu chuỗi có nhiều hơn 1 cặp dấu () thì có trường hợp sai: Dấu mở nằm ở phần cắt chuỗi này và dấu đóng tương ứng nằm ở phần cắt chuỗi kia
Nếu chuỗi có 1 cặp dấu () nằm đầu và cuối chuỗi (không có /1000) thì cũng sai. Hàm DValue đọc "thấy ghê quá" nên chưa dám đụng vào sửa
 

File đính kèm

  • 181228-Khoi luong PCCC.xls
    322.5 KB · Đọc: 38
Lần chỉnh sửa cuối:
Nếu sử dụng Evaluate và chia nhỏ chuỗi theo gợi ý của bi phèn thì có hàm sau:

PHP:
Public Function TinhChuoi(ByVal MyStr As String) As Double
TinhChuoi = Evaluate(Replace(MyStr, ",", "."))
End Function
'--------------------------//
Function Tinhchuoi2(MyStr As String) As Double
Dim Ln As Long, Tmp As Double, Vitri As Long, RestStr As String, CalStr As String
CalStr = MyStr: Ln = Len(CalStr)
If Ln < 255 Then
    Tinhchuoi2 = TinhChuoi(CalStr): Exit Function
Else

    Vitri = InStr(230, CalStr, "+")
    RestStr = Right(CalStr, Ln - Vitri)
    Tmp = TinhChuoi(Left(CalStr, Vitri - 1))
    Tinhchuoi2 = Tinhchuoi2(Tmp & "+" & RestStr)
End If
End Function
Nếu chuỗi có dạng ( ..............)/1000 thì dùng hàm tinhchuỏi3:

PHP:
Function Tinhchuoi3(MyStr As String) As Double
Dim CalStr As String
If InStr(1, MyStr, "(") = 0 Then
    Tinhchuoi3 = Tinhchuoi2(MyStr)
Else
    CalStr = Replace(Replace(MyStr, "(", ""), ")/1000", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 1000
End If
End Function

Nếu chuỗi có nhiều hơn 1 cặp dấu () thì có trường hợp sai: Dấu mở nằm ở phần cắt chuỗi này và dấu đóng tương ứng nằm ở phần cắt chuỗi kia
Nếu chuỗi có 1 cặp dấu () nằm đầu và cuối chuỗi (không có /1000) thì cũng sai. Hàm DValue đọc "thấy ghê quá" nên chưa dám đụng vào sửa
Rất cảm ơn bác, bác đã giải được bài toán lâu này của em ạ (em nhớ là từ đợt Tết đến giờ). Hiện nay em đã thử thêm gấp 5 lần tham số đầu vào ở ô diễn giải vẫn ra kết quả ngon lành ạ. Em không rõ về VBA nên anh Befailt bảo tách chuỗi, em cứ tưởng là tách khối lượng ở ô diễn giải để đảm bảo nhỏ hơn 255 ký tự thì lại phức tạp file diễn giải của em.
Chỗ bác lưu ý: "Nếu chuỗi có nhiều hơn 1 cặp dấu () thì có trường hợp sai: Dấu mở nằm ở phần cắt chuỗi này và dấu đóng tương ứng nằm ở phần cắt chuỗi kia
Nếu chuỗi có 1 cặp dấu () nằm đầu và cuối chuỗi (không có /1000) thì cũng sai" em chưa kiểm nghiệm, để em kiểm tra thử xem, vì cũng có những biểu thức em phải diễn giải đóng mở cặp dấu ().
À em muốn kết xuất đoạn code của bác ra file .XLA thì làm ntn ạ, em muốn chia sẻ với các đồng nghiệp.
Em dùng Dvalue cũng được năm, nếu khi nào bác thấy "hết ghê" bác "đụng vào nó giúp em"
 
Tạo mới 1 file excel, xóa chỉ chừa 1 sheet trắng
Insert 1 module, chép 3 hàm trên vào
Save as excel add-in (xla hoặc xlam)
 
Nếu sử dụng Evaluate và chia nhỏ chuỗi theo gợi ý của bi phèn thì có hàm sau:

PHP:
Public Function TinhChuoi(ByVal MyStr As String) As Double
TinhChuoi = Evaluate(Replace(MyStr, ",", "."))
End Function
'--------------------------//
Function Tinhchuoi2(MyStr As String) As Double
Dim Ln As Long, Tmp As Double, Vitri As Long, RestStr As String, CalStr As String
CalStr = MyStr: Ln = Len(CalStr)
If Ln < 255 Then
    Tinhchuoi2 = TinhChuoi(CalStr): Exit Function
Else
 
    Vitri = InStr(230, CalStr, "+")
    RestStr = Right(CalStr, Ln - Vitri)
    Tmp = TinhChuoi(Left(CalStr, Vitri - 1))
    Tinhchuoi2 = Tinhchuoi2(Tmp & "+" & RestStr)
End If
End Function
Nếu chuỗi có dạng ( ..............)/1000 thì dùng hàm tinhchuỏi3:

PHP:
Function Tinhchuoi3(MyStr As String) As Double
Dim CalStr As String
If InStr(1, MyStr, "(") = 0 Then
    Tinhchuoi3 = Tinhchuoi2(MyStr)
Else
    CalStr = Replace(Replace(MyStr, "(", ""), ")/1000", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 1000
End If
End Function

Nếu chuỗi có nhiều hơn 1 cặp dấu () thì có trường hợp sai: Dấu mở nằm ở phần cắt chuỗi này và dấu đóng tương ứng nằm ở phần cắt chuỗi kia
Nếu chuỗi có 1 cặp dấu () nằm đầu và cuối chuỗi (không có /1000) thì cũng sai. Hàm DValue đọc "thấy ghê quá" nên chưa dám đụng vào sửa
Anh PTM ơi, cái lỗi ở hàm tinhchuoi3 anh có cách nào xử lý được không ạ?
 
Bạn cần phải diễn giải ra, tỉ mỉ, chi tiết cái lỗi bạn gặp, bạn gửi file và chỉ rõ ra cái lỗi bạn đang vướng phải, thì người giúp đỡ sẽ tiếp tục hướng dẫn và fix lỗi giúp bạn.
Cảm ơn anh Nghĩa trước ạ!
Tôi gửi lại file của anh PTM0412, code được ẩn trong file luôn ạ.
Tôi có chỉnh sửa các trường hợp mắc phải, mong a nghiên cứu hoàn thiện lỗi này ạ
 

File đính kèm

  • 190625-Ham Tinhchuoi (PTM0412).xls
    303.5 KB · Đọc: 45
Bạn xài tạm rồi tính sau:
PHP:
Function Tinhchuoi3(MyStr As String) As Double
Dim CalStr As String
If InStr(1, MyStr, ")/1000") = 0 Then
    Tinhchuoi3 = Tinhchuoi2(MyStr)
Else
    CalStr = Replace(Right(MyStr, Len(MyStr)-1), ")/1000", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 1000
End If
End Function
 
Chia 10, chia 100, chia 1000, không chia
PHP:
Function Tinhchuoi3(MyStr As String) As Double
Dim CalStr As String
If Left(MyStr, 1) = "(" And Right(MyStr, 1) = ")" Then
    CalStr = Mid(MyStr, 2, Len(MyStr) - 2)
    Tinhchuoi3 = Tinhchuoi2(CalStr)
ElseIf InStr(1, MyStr, ")/10") = 0 Then
    Tinhchuoi3 = Tinhchuoi2(MyStr)
ElseIf InStr(1, MyStr, ")/1000") > 0 Then
    CalStr = Replace(Right(MyStr, Len(MyStr) - 1), ")/1000", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 1000
ElseIf InStr(1, MyStr, ")/100") > 0 Then
    CalStr = Replace(Right(MyStr, Len(MyStr) - 1), ")/100", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 100
ElseIf InStr(1, MyStr, ")/10") > 0 Then
    CalStr = Replace(Right(MyStr, Len(MyStr) - 1), ")/10", "")
    Tinhchuoi3 = Tinhchuoi2(CalStr) / 10
Else
    Tinhchuoi3 = Tinhchuoi2(MyStr)
End If
End Function
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom