Hỗ trợ hàm UDF tách khổ, độ dày

Liên hệ QC

Tình nghĩa giang hồ

Thanh sơn bất cải, lục thủy trường lưu
Tham gia
29/9/20
Bài viết
330
Được thích
429
Chào anh chị, nhờ anh chị hỗ trợ giúp em vấn đề này,
Nội dung: nếu mã đó chứa 1F, 1F1, 1F2, 2F thì lùi lại 1 khoảng trắng. Hai ký tự đầu là khổ, những ký tự còn lại là độ dày.
Nhờ anh chị giúp đỡ em vấn đề này, đây cũng là vấn đề chung của ngành gỗ, nội thất.
Em cảm ơn anh chị.
KhỗĐộ dày
HPL LK1195A/LK1195A MDF MUFSTD 4834
48​
34​
HPL LK1195A/LK1195A MDF MUFSTD 4834 2F
48​
34​
HPL LK1195A/LK1195A MDF MUFSTD 4840 1F1
48​
40​
HPL LK1195A/LK1195A MDF MUFSTD 4950 2F
49​
50​
HPL LK358D/0 PLY WPRSTD 4803 1F
48​
3​
MFC 612PL/612PL UFSTD 4904.5
49​
4.5​
MFC 612PL/612PL UFSTD 4904.5 2F
49​
4.5​
MFC 612PL/615PL UFSTD 4904.5 1F2
49​
4.5​
ACRYLIC PARC50/MEL104SH MDF MUFSTD 4817
48​
17​
ACRYLIC PARC50/MEL104SH MDF MUFSTD 4817 1F2
48​
17​
MFC 200T/200T UFEPA 4816
48​
16​
 
PHP:
function getInfo(byval str as string, byval indexInfo as long ) as variant
const listMatchStr = "1F1,1F2,2F,1F"
const lenSize = 2 'digits'
Dim item as variant, tmp as variant
Dim lngSize as long, dThick as double
for each item in vba.split(listMatchStr, ",")
str = vba.replace(str, vba.cstr(item),"")
next item
str = vba.trim(str)
tmp = vba.split(str, " ")
str = tmp(ubound(tmp))
lngSize = vba.clng(vba.left(str, lenSize))
dThick = vba.cdbl( vba.mid(str, lenSize +1))
if indexInfo =1 then
getInfo = lngSize
elseif indexInfo  = 2 then
getInfo =dThick
End if
end function
Công thức
B2= getInfo(A2, 1)
C2= getInfo(A2, 2)
 
Upvote 0
PHP:
function getInfo(byval str as string, byval indexInfo as long ) as variant
const listMatchStr = "1F1,1F2,2F,1F"
const lenSize = 2 'digits'
Dim item as variant, tmp as variant
Dim lngSize as long, dThick as double
for each item in vba.split(listMatchStr, ",")
str = vba.replace(str, vba.cstr(item),"")
next item
str = vba.trim(str)
tmp = vba.split(str, " ")
str = tmp(ubound(tmp))
lngSize = vba.clng(vba.left(str, lenSize))
dThick = vba.cdbl( vba.mid(str, lenSize +1))
if indexInfo =1 then
getInfo = lngSize
elseif indexInfo  = 2 then
getInfo =dThick
End if
end function
Công thức
B2= getInfo(A2, 1)
C2= getInfo(A2, 2)
Kết quả độ dày ở các dòng 4.5 lại ra thành 45 bạn à.
 
Upvote 0
Anh làm thế nào để cho kết quả là 45 thế.
Rồi. Đã dò lại code và thấy rằng nếu Control Panel đặt dấu chấm làm phân cách thập phân thì hàm chạy đúng, còn để dấu phẩy thì kết quả là 45. Muốn sửa cho đúng (trong trường hợp dấu phẩy) mà không thay đổi Control Panel thì chỗ dThick phải thay bằng: dThick = CDbl(Mid(Replace(str, ".", ","), lenSize + 1))

P/S: Còn "ông" Phuocam lâu nay cười tui hơi nhiều, nhột đó nghe.
 
Upvote 0
Rồi. Đã dò lại code và thấy rằng nếu Control Panel đặt dấu chấm làm phân cách thập phân thì hàm chạy đúng, còn để dấu phẩy thì kết quả là 45. Muốn sửa cho đúng (trong trường hợp dấu phẩy) mà không thay đổi Control Panel thì chỗ dThick phải thay bằng: dThick = CDbl(Mid(Replace(str, ".", ","), lenSize + 1))

Vậy phải làm thế này anh. Đông tây y đều được.

Dim sDecimalSymbol as String
sDecimalSymbol = VBA.mid(1 / 2, 2, 1)
'....'
str = tmp(ubound(tmp))
str = VBA.Replace(VBA.Replace(str, ".", sDecimalSymbol), ",", sDecimalSymbol)
'...'
 
Upvote 0
Vậy phải làm thế này anh. Đông tây y đều được.

Dim sDecimalSymbol as String
sDecimalSymbol = VBA.mid(1 / 2, 2, 1)
'....'
str = tmp(ubound(tmp))
str = VBA.Replace(VBA.Replace(str, ".", sDecimalSymbol), ",", sDecimalSymbol)
'...'
Chỗ sDecimalSymbol = VBA.Mid(1 / 2, 2, 1) trong máy bạn thế nào chứ máy tôi do 1/2 hiển thị là ,5 nên lấy ký tự thứ 2 là nó ra số 5. Do vậy tôi phải sửa thành = VBA.Mid(1 / 2, 1, 1) mới đúng
 
Upvote 0
Lại cười, làm nhột ghê!
1648627166586.png
 
Upvote 0
Chỗ sDecimalSymbol = VBA.Mid(1 / 2, 2, 1) trong máy bạn thế nào

Máy tính của em luôn để mặc định khi cài đặt Windows bản US/EN, khả năng là giống 99.999999% máy tính của người khác, và chỉ khác máy tính của anh mà thôi. :p


Chào thua anh luôn.

PHP:
Private Function getDecimalSymbol() As String
    Dim str As String, i As Long, s As String
    str = 1 / 2
    For i = 1 To VBA.Len(str)
        s = VBA.Mid$(str, i, 1)
        If Not VBA.IsNumeric(s) = True Then
            getDecimalSymbol = s
            Exit Function
        End If
    Next i
End Function

''
sDecimalSymbol = getDecimalSymbol()
 
Upvote 0
Máy tính của em luôn để mặc định khi cài đặt Windows bản US/EN, khả năng là giống 99.999999% máy tính của người khác, và chỉ khác máy tính của anh mà thôi. :p



Chào thua anh luôn.

PHP:
Private Function getDecimalSymbol() As String
    Dim str As String, i As Long, s As String
    str = 1 / 2
    For i = 1 To VBA.Len(str)
        s = VBA.Mid$(str, i, 1)
        If Not VBA.IsNumeric(s) = True Then
            getDecimalSymbol = s
            Exit Function
        End If
    Next i
End Function

''
sDecimalSymbol = getDecimalSymbol()
Haha, thì máy tôi cũng mặc định là EN-US mà, chỉ mỗi 1 thay đổi là tôi quen dùng dấu phẩy là phân cách thập phân.

Thôi thì để cho máy nào cũng đúng thì chỗ đó thay bằng: sDecimalSymbol = VBA.Mid(3 / 2, 2, 1)
 
Upvote 0
Chỗ sDecimalSymbol = VBA.Mid(1 / 2, 2, 1) trong máy bạn thế nào chứ máy tôi do 1/2 hiển thị là ,5 nên lấy ký tự thứ 2 là nó ra số 5. Do vậy tôi phải sửa thành = VBA.Mid(1 / 2, 1, 1) mới đúng
Bác thử cái này xem
Mã:
sDecimalSymbol = Application.International(xlDecimalSeparator)
 
Upvote 0
Làm đại, sai bỏ:
PHP:
Option Explicit
Function tach(ByVal cell As Range, L As Integer)
Dim s, d As String
d = Application.DecimalSeparator
s = Split(Replace(cell, IIf(d = ".", ",", "."), d), " ")
   tach = IIf(IsNumeric(s(UBound(s))), s(UBound(s)), s(UBound(s) - 1))
   tach = Choose(L, Int(tach / 100), Mid(tach, 3, 255) + 0)
End Function
 

File đính kèm

  • Tach.xlsm
    16.6 KB · Đọc: 1
Upvote 0
Web KT

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

Back
Top Bottom