Xin mạo muội hỏi về tình huống sử dụng VBA liệu có thể giải quyết được không ah?

Liên hệ QC

nguyenmanhnam

Thành viên tiêu biểu
Tham gia
24/7/10
Bài viết
434
Được thích
266
Các anh (chị) cho em hỏi VBA có khả năng tách số ra khỏi chữ được không ah. Cụ thể em có tình huống khi diễn
Tại ô A1 em đánh: Số dầm A1 là (2+5)*3 thì tại ô B1 lập tức nhận dạng nó chỉ xét đến kết quả phép tính (2+5)*3 tức nó hiện bằng 21.
Khi ô A1 của em được thay đổi bằng Số dầm A1 là (2+5)*4 tương ứng ô B1 sẽ tự động bằng 28
Khi diễn giải ô A1 của em luôn có đặc trưng thành phần trước là chữ, thành phần sau cùng là các phép tính bằng số ví dụ ở côg thức trên là (2+5)*3
 
Bạn dùng hàm này là được rùi!
Mã:
Function Tinh(cel As Range)
Application.Volatile
tchTinh = Evaluate(Right(cel, Len(cel) - InStr(1, cel, "là") - 2))
End Function

Hoặc dùng công thức trong Name như sau:
PHP:
tinh1=IF(ISERROR(FIND("là",Sheet1!$A1,1)),"",EVALUATE(RIGHT(Sheet1!$A1,LEN(Sheet1!$A1)-FIND("là",Sheet1!$A1,1)-2)))
 

File đính kèm

Upvote 0
Các anh (chị) cho em hỏi VBA có khả năng tách số ra khỏi chữ được không ah. Cụ thể em có tình huống khi diễn
Tại ô A1 em đánh: Số dầm A1 là (2+5)*3 thì tại ô B1 lập tức nhận dạng nó chỉ xét đến kết quả phép tính (2+5)*3 tức nó hiện bằng 21.
Khi ô A1 của em được thay đổi bằng Số dầm A1 là (2+5)*4 tương ứng ô B1 sẽ tự động bằng 28
Khi diễn giải ô A1 của em luôn có đặc trưng thành phần trước là chữ, thành phần sau cùng là các phép tính bằng số ví dụ ở côg thức trên là (2+5)*3
Nói chung là... có thể được nếu biết trước đặc điểm của thằng "tiền tố" (prefix ở trước biểu thức tính toán)
Vậy, hãy cho file lên đi... Còn không thì search trên diễn đàn ---> Dạng bài này có đầy, thậm chí dùng công thức cũng được luôn
(Làm mẫu cho bạn e rằng chẳng đúng yêu cầu thực tế)
 
Upvote 0
Trong khi chờ đợi 1 giải pháp nào đó hay hơn…, tôi xin đóng góp bằng 1 ví dụ, cái này tôi cũng học được từ diễn đàn, trong đó có 1 phần giúp đỡ từ thầy NDU.
Chú ý: như NDU đã nói: cần có 1 đặc điểm "tiền tố" (prefix ở trước biểu thức tính toán), trong ví dụ là phải có 1 dấu 2 chấm ở trước biểu thức tính toán.
Bạn xem đúng ý chưa nhé.
 

File đính kèm

Upvote 0
Trong khi chờ đợi 1 giải pháp nào đó hay hơn…, tôi xin đóng góp bằng 1 ví dụ, cái này tôi cũng học được từ diễn đàn, trong đó có 1 phần giúp đỡ từ thầy NDU.
Chú ý: như NDU đã nói: cần có 1 đặc điểm "tiền tố" (prefix ở trước biểu thức tính toán), trong ví dụ là phải có 1 dấu 2 chấm ở trước biểu thức tính toán.
Bạn xem đúng ý chưa nhé.
Theo Mình nghĩ không cần có dấu 2 chấm phía trước (chỉ cần có dấu cách giữa chữ và công thức, đồng thời phía sau công thức không ghi chữ) là được.
VD: A1=Số dầm A1 là (2+5)*3 (như yêu cầu của tác giả). Đặt con trỏ tại ô B1 -> vào name đặt công thức cho ô Refer như sau:
Mã:
=EVALUATE(TRIM(RIGHT(SUBSITUTE($A1," ",REPT(" ",LEN($A1))),LEN($A1))))
 

File đính kèm

Upvote 0
Các anh (chị) cho em hỏi VBA có khả năng tách số ra khỏi chữ được không ah. Cụ thể em có tình huống khi diễn
Tại ô A1 em đánh: Số dầm A1 là (2+5)*3 thì tại ô B1 lập tức nhận dạng nó chỉ xét đến kết quả phép tính (2+5)*3 tức nó hiện bằng 21.
Khi ô A1 của em được thay đổi bằng Số dầm A1 là (2+5)*4 tương ứng ô B1 sẽ tự động bằng 28
Khi diễn giải ô A1 của em luôn có đặc trưng thành phần trước là chữ, thành phần sau cùng là các phép tính bằng số ví dụ ở côg thức trên là (2+5)*3
Theo mình, như diễn giải của chủ topic này thì VBA đủ điều kiện để giải :thành phần trước là chữ, thành phần sau cùng là các phép tính bằng số
Như vậy giữa PHÉP TÍNH và CHỮ luôn cách nhau bằng một khoảng trắng, mình xin góp cách giải bằng hàm tự tạo
Mã:
Public Function tinh(Vung As Range) As Long
    Dim I, J As Long, Tam
    Const So = "0123456789+-*/()"
        J = InStrRev(Vung, " ")
            For I = J To Len(Vung)
                If InStr(1, So, Mid(Vung, I, 1)) Then Tam = Tam & Mid(Vung, I, 1)
            Next
    tinh = Evaluate(Tam)
End Function
 

File đính kèm

Upvote 0
Theo mình, như diễn giải của chủ topic này thì VBA đủ điều kiện để giải :thành phần trước là chữ, thành phần sau cùng là các phép tính bằng số
Như vậy giữa PHÉP TÍNH và CHỮ luôn cách nhau bằng một khoảng trắng, mình xin góp cách giải bằng hàm tự tạo
Mã:
Public Function tinh(Vung As Range) As Long
    Dim I, J As Long, Tam
    Const So = "0123456789+-*/()"
        J = InStrRev(Vung, " ")
            For I = J To Len(Vung)
                If InStr(1, So, Mid(Vung, I, 1)) Then Tam = Tam & Mid(Vung, I, 1)
            Next
    tinh = Evaluate(Tam)
End Function
Ẹc... Ẹc... Nếu anh đã nói giữa PHÉP TÍNH và CHỮ luôn cách nhau bằng một khoảng trắng thì cần gì pho phiếc cho nó mết
PHP:
Function ResVal(Exp As String) As Double
  Exp = Trim(Exp)
  ResVal = Evaluate(Mid(Exp, InStrRev(Exp, " "), Len(Exp)))
End Function
Đúng không?
--------------------
Nói chung, dù là làm bằng cách gì mà tác giả không lên tiếng thì... làm cũng như không! Biết đâu chú xem xong lại bảo "Các bác ơi, file của em hổng phải vậy.... Nó khác..."
 
Upvote 0
Hàm như vầy có nhanh hơn không mấy bác? :D
Mã:
Function tinh(cel As Range)
Application.Volatile
Const toan = "+-*/"
For i = UBound(Split(cel, " ")) To 0 Step -1
    For j = 1 To Len(toan)
    If InStr(1, Split(cel, " ")(i), Mid(toan, j, 1)) > 0 Then
        tinh = Evaluate(Split(cel, " ")(i))
        Exit Function
    End If
    Next
Next
End Function
 
Upvote 0
Code của anh cò già và của anh ndu sẽ bị lỗi khi ô đó chỉ có công thức. Còn của Pozsi thì đúng cả trường hợp vừa có chữ và công thức hoặc chỉ có công thức không.
 
Upvote 0
Code của anh cò già và của anh ndu sẽ bị lỗi khi ô đó chỉ có công thức. Còn của Pozsi thì đúng cả trường hợp vừa có chữ và công thức hoặc chỉ có công thức không.
Đã bảo rằng:
Nói chung, dù là làm bằng cách gì mà tác giả không lên tiếng thì... làm cũng như không!
Thế thì bạn thắc mắc làm gì chứ!
Code để giải quyết bài toán này đã có nhiều rồi ---> Giờ chỉ chờ tác giả đưa file lên rồi mới tính tiếp được!
Làm gì có code nào có khả năng giải quyết được mọi tình huống, đúng không? Mà tình huống thì... nhiều lắm, ví dụ: Trong biểu thức cũng có khoảng trắng, bạn tính sao đây?
 
Upvote 0
Code của anh cò già và của anh ndu sẽ bị lỗi khi ô đó chỉ có công thức. Còn của Pozsi thì đúng cả trường hợp vừa có chữ và công thức hoặc chỉ có công thức không.
Bài của chủ topic :ô A1 của em luôn có đặc trưng thành phần trước là chữ, thành phần sau cùng là các phép tính bằng số
Hihi, Minhcong thấy "hông": luôn có chữ và công thức mà
Còn nếu thích Minhcong thử bẫy lỗi cái "zụ" Minhcong nói xem nhé
Ẹc... Ẹc... Nếu anh đã nói giữa PHÉP TÍNH và CHỮ luôn cách nhau bằng một khoảng trắng thì cần gì pho phiếc cho nó mết
Thanks. Híc, đi ăn cơm "zồi" mới nghĩ "za". Đói bụng thành ngu wa
 
Upvote 0
Tác giả đâu rùi? Có ý kiến gì không? :(
 
Upvote 0
Đã bảo rằng:

Thế thì bạn thắc mắc làm gì chứ!
Code để giải quyết bài toán này đã có nhiều rồi ---> Giờ chỉ chờ tác giả đưa file lên rồi mới tính tiếp được!
Làm gì có code nào có khả năng giải quyết được mọi tình huống, đúng không? Mà tình huống thì... nhiều lắm, ví dụ: Trong biểu thức cũng có khoảng trắng, bạn tính sao đây?
Không dám dấu gì các bác em muốn học VBA để có thể sử dụng trong bóc tách diễn giải khối lượng của KS kinh tế xây dựng. Qua mấy hôm nghiên cứu, bây giờ em cũng bắt đầu tập được những bài toán đơn giản, em hy vọng trong thời gian tới em có thể hiểu được cách làm bài toán các bác đã giúp đỡ. Để cụ thể bài toán em xin Post đầu bài lên kính mong các bác giúp đỡ.
* Đầu bài của em được thể hiện ở Sheet!Daubai: Kết quả tách số khỏi chữ được cập nhật ở cột C
* Nhân đây em xin hỏi ý tưởng của dự toán Acitt với mong muốn được các anh, chị chỉ giúp cách tư duy cách làm (phần ví dụ em để ở Sheet Acitt): Trong chương trình dự toán Aciit người ta còn có thể làm phép tính ngay ở ô diễn giải cần tính (mình chỉ đánh đầu vào, chương trình tự động thêm dấu = và kết quả). Ví dụ: Dầm D1: 3*2*1 = 6. Đây là công đoạn khó nhất vì không hiểu chương trình sử dụng ngôn ngữ lập trình gì mà lại cập nhật được kết quả tại chính ô đó.
kế tiếp đó là xây dựng hàm TL có tác dụng cộng các kết quả các ô cột B vào với nhau, em nghĩ hàm TL này khi mình đọc kỹ các ví dụ trên diễn đàn thì cũng có thể làm được.
 

File đính kèm

Upvote 0
Không dám dấu gì các bác em muốn học VBA để có thể sử dụng trong bóc tách diễn giải khối lượng của KS kinh tế xây dựng. Qua mấy hôm nghiên cứu, bây giờ em cũng bắt đầu tập được những bài toán đơn giản, em hy vọng trong thời gian tới em có thể hiểu được cách làm bài toán các bác đã giúp đỡ. Để cụ thể bài toán em xin Post đầu bài lên kính mong các bác giúp đỡ.
* Đầu bài của em được thể hiện ở Sheet!Daubai: Kết quả tách số khỏi chữ được cập nhật ở cột C
* Nhân đây em xin hỏi ý tưởng của dự toán Acitt với mong muốn được các anh, chị chỉ giúp cách tư duy cách làm (phần ví dụ em để ở Sheet Acitt): Trong chương trình dự toán Aciit người ta còn có thể làm phép tính ngay ở ô diễn giải cần tính (mình chỉ đánh đầu vào, chương trình tự động thêm dấu = và kết quả). Ví dụ: Dầm D1: 3*2*1 = 6. Đây là công đoạn khó nhất vì không hiểu chương trình sử dụng ngôn ngữ lập trình gì mà lại cập nhật được kết quả tại chính ô đó.
kế tiếp đó là xây dựng hàm TL có tác dụng cộng các kết quả các ô cột B vào với nhau, em nghĩ hàm TL này khi mình đọc kỹ các ví dụ trên diễn đàn thì cũng có thể làm được.
Để viết được kết quả như thế người ta dùng hàm tự tạo bằng VBA (rất nhiều công đoạn) vì phải loại trừ tất cả các trường hợp rất khó (ngoài trừ trong hướng dẫn sử dụng tác giả có ghi yêu cầu về cách nhập liệu). Cái này cần cao thủ về VBA.
 
Lần chỉnh sửa cuối:
Upvote 0
Để viết được kết quả như thế người ta dùng hàm tự tạo bằng VBA (rất nhiều công đoạn) vì phải loại trừ tất cả các trường hợp rất khó (ngoài trừ trong hướng dẫn sử dụng tác giả có ghi yêu cầu về cách nhập liệu). Cái này cần cao thủ về VBA.
Chỉ nội cái dấu thập phân là CHẤM hay PHẨY thôi cũng đủ mệt rồi
Ví dụ:
- ta có chuổi Dầm D1: 123,456
- Cứ cho rằng dấu hiệu nhận biết biểu thức cần tính bắt đầu từ chữ "" hoặc dấu ":"
- Vậy số cần tách sẽ là 123,456
- Liệu ta có biết được số ấy là 123456 có dấu phân cách ngàn hay 123 phẩy 456 đây
-------------------------
Lưu ý rằng:
- Đã là code thì phải chính xác với bất cứ quy định nào của máy tính
- Đã là code thì phải dựa trên những quy định về nhập liệu cho trước đó
- Vậy: Quy định nhập liệu của tác giả là gì đây?
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải là không giải quyết được các vấn đề, nhưng chương trình sẽ rất cồng kềnh nếu sử lý hết các tình huống. Hơn nữa, mình nghĩ chỉ nên giải quyết vấn đề cơ bản ở đây còn mở rộng tác giả tự nghiên cứu thêm. Để giải quyết cơ bản thì dữ liệu nguồn phải đảm bảo yêu cầu

-Công thức trong chuỗi phải viết liền, không dấu cách.
-Công thức phải viết đúng cú pháp (Công thức đó nếu gán cho 1 ô phải trả về giá trị hợp lệ), không dùng x thay phép nhân
-Công thức viết sau cùng của chuỗi

Nếu như vậy, bài toán trở nên đơn giản hơn nhiều
 
Upvote 0
Không phải là không giải quyết được các vấn đề, nhưng chương trình sẽ rất cồng kềnh nếu sử lý hết các tình huống. Hơn nữa, mình nghĩ chỉ nên giải quyết vấn đề cơ bản ở đây còn mở rộng tác giả tự nghiên cứu thêm. Để giải quyết cơ bản thì dữ liệu nguồn phải đảm bảo yêu cầu

-Công thức trong chuỗi phải viết liền, không dấu cách.
-Công thức phải viết đúng cú pháp (Công thức đó nếu gán cho 1 ô phải trả về giá trị hợp lệ), không dùng x thay phép nhân
-Công thức viết sau cùng của chuỗi
Nếu như vậy, bài toán trở nên đơn giản hơn nhiều
Vâng vì em viết bản thân em sử dụng mà các giả thiết như bác đưa, xin các bác giúp hộ em trường hợp cơ bản tại sheet!Daubai để em có thể học tập . Rất mong các bác giúp đỡ
 
Upvote 0
Không phải là không giải quyết được các vấn đề, nhưng chương trình sẽ rất cồng kềnh nếu sử lý hết các tình huống. Hơn nữa, mình nghĩ chỉ nên giải quyết vấn đề cơ bản ở đây còn mở rộng tác giả tự nghiên cứu thêm. Để giải quyết cơ bản thì dữ liệu nguồn phải đảm bảo yêu cầu

-Công thức trong chuỗi phải viết liền, không dấu cách.
-Công thức phải viết đúng cú pháp (Công thức đó nếu gán cho 1 ô phải trả về giá trị hợp lệ), không dùng x thay phép nhân
-Công thức viết sau cùng của chuỗi

Nếu như vậy, bài toán trở nên đơn giản hơn nhiều
Dùng dấu x thay dấu nhân hoặc dấu : thay dấu chia cũng chẳng có vấn đề gì anh à (Replace là xong)
Nếu có thể được, ta hãy quy định trong biểu thức chỉ dùng dấu thập phân, không được dùng dấu phân cách ngàn trong bất cứ trường hợp nào ---> Thế thì bài toán sẽ được giải quyết (cho dù tác giả muốn nhập dấu thập phân ấy là chấm hay phẩy)
Mấy cái dấu phân cách này em ngán nhất!
 
Upvote 0
Bạn tham khảo xem, ở đây mình dùng hàm còn muốn thay đổi chính ô gốc thì dùng Sub
Dữ liệu phải bảo đảm như bài trước
 

File đính kèm

Upvote 0
Bạn tham khảo xem, ở đây mình dùng hàm còn muốn thay đổi chính ô gốc thì dùng Sub
Dữ liệu phải bảo đảm như bài trước

Cảm ơn bác rất nhiều, quả thật mới đầu em chỉ dám xin ý tưởng thôi. Đối với em bước đầu được như thế này đã là vượt quá sự mong đợi. Em mạnh dạn mở Code của bác để em học, có một số cụm từ em đọc chưa hiểu lắm, rất mong bác giúp em một lần nữa dịch hộ em đại ý đoạn Code để em có thể tra cứu, vận dụng sang các trường hợp khác. Sau đây em xin được mạn phép trích dẫn đoạn code của bác lên, mong bác giúp đỡ em.
Option Explicit
Function TL(Rg As Range, Dec As String) As Double
Dim cll As Range
For Each cll In Rg
TL = TL + Canc(cll.Text, Dec)
Next
End Function
Function Canc(ByVal ch As String, ByVal Dec As String) As Double
Dim i As Long, ch1 As String, kt As Boolean
For i = Len(ch) To 1 Step -1
If Mid(ch, i, 1) = "=" Then GoTo Dung
If InStr(1, "0123456789.,", Mid(ch, i, 1)) Then ch1 = ch1 & Mid(ch, i, 1)
If Mid(ch, i, 1) = "-" Then kt = True
Next
Dung:
If Dec = "," Then ch1 = Replace(ch1, Dec, ".")
Canc = Val(StrReverse(ch1)) * IIf(kt, -1, 1)
End Function
Function Tg(ByVal ch As String, Dec As String) ' As Double
Dim i As Long, ch1 As String
For i = Len(ch) To 1 Step -1
If InStr(1, "0123456789-+*/.,", Mid(ch, i, 1)) = 0 Then GoTo Dung
ch1 = ch1 & Mid(ch, i, 1)
Next
Dung:
If ch1 = "" Then
Tg = ch
Exit Function
End If
ch1 = StrReverse(ch1)
If Dec = "," Then
ch1 = Replace(ch1, ".", ""): ch1 = Replace(ch1, ",", ".")
Else
ch1 = Replace(ch1, ",", "")
End If
ch1 = Replace(Format(Evaluate(ch1), "#,##0.#####"), ".", "@")
ch1 = Replace(ch1, ",", ".")
ch1 = Replace(ch1, "@", ",")
ch1 = IIf(IsNumeric(Mid(ch1, Len(ch1), 1)), ch1, Left(ch1, Len(ch1) - 1))
Tg = ch & "=" & ch1
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom