Lập công thức- Mọi người giúp đỡ (1 người xem)

  • Thread starter Thread starter minhnc
  • Ngày gửi Ngày gửi

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

minhnc

Nguyễn Công Minh
Tham gia
13/1/07
Bài viết
160
Được thích
490
Nghề nghiệp
Lang thang
Tôi đang có 1 bảng tính, chỉ dùng công thức nhân thông thường nhưng vướng cái là cột số lượng và đơn giá bao gồm cả số và chữ, Nhưng tôi muốn cột thành tiền chỉ nhân số số tại 2 cột đó (xem file đính kèm). Mong mọi người giúp đỡ
 

File đính kèm

cần thêm thông tin

minhnc đã viết:
Tôi đang có 1 bảng tính, chỉ dùng công thức nhân thông thường nhưng vướng cái là cột số lượng và đơn giá bao gồm cả số và chữ, Nhưng tôi muốn cột thành tiền chỉ nhân số số tại 2 cột đó (xem file đính kèm). Mong mọi người giúp đỡ
cell D4 có dữ liệu: 2 người/3500000 đồng/tháng/1 người
thường thì tôi làm thế này thêm các ô phụ Vd: như F4=2,G4="người",H4=3500000,.... sau đó ô D4=F4&G4&H4&.... -> như thế khi này ta có thể dàng dùng phép nhân

cho hỏi thêm bạn:
+ D4= 2 người/3500000 đồng/tháng/1 người chính xác phải là 2 người * 3500000 đồng/tháng/người hoặc là 2 người*3500000 đồng/1 tháng/ 1 người ???
+ Liệu chỉ có phép nhân ko hay có khi lại có các phép tính khác như *, +, - vvv.. khi đó bài toán lại khác (chắc tôi đoán chỉ có phép nhân và chia thôi nhỉ) ???
+ Một điều nữa, đó là bạn có lặp đi lặp lại công việc này nhiều k? trong file bạn thường xử lý có nhiều dòng số liệu k? -> vì như thế cân nhắc có cần giải pháp triệt để hay chỉ một phần (chẳng hạn chỉ tách sô -> sau đó xử lý bước 2 bằng thao tác khác), tức là xét đến sự khả thi của giải pháp
+ cuối cùng là mong bạn mô tả rõ hơn và các trường hợp số liệu có thể xảy ra
 
2 người * 3500000 đồng/tháng/người
hoặc là 2 người*3500000 đồng/tháng/ người ???
Hey!
màu xanh với màu nâu có gì khác hở TigerTiger?
Theo mình hiểu thì 1 công việc đó đòi hỏi 2 người, mỗi người 3,5 triệu 1 tháng. Nếu 4 tháng thì 2n x 3,5tr x 4th
Tách ra đầy đủ kèm đơn vị tính là:
- thời gian: tháng
- số người: người
- lương: đồng/người/tháng
Tính theo chỉ đvt là :
(tháng x người) x (đng) / (tháng x người)
Chia tử số và mẫu số cho (tháng x người) ta được ....hắt xì ....,
được ....hắt xì ....
được gì quên mất rồi!
 
Lần chỉnh sửa cuối:
minhnc đã viết:
Tôi đang có 1 bảng tính, chỉ dùng công thức nhân thông thường nhưng vướng cái là cột số lượng và đơn giá bao gồm cả số và chữ, Nhưng tôi muốn cột thành tiền chỉ nhân số số tại 2 cột đó (xem file đính kèm). Mong mọi người giúp đỡ
Bạn nên bố trí lại số liệu bảng tính của bạn cho hợp lý xong tính toán bình thường là được, làm sao phải tự làm khó vậy.
 

File đính kèm

Như salam thì ko nói làm gì.
Vì nội dung công việc khác nhau dẫn đến số lượng, đơn giá khác do vậy Tôi nghĩ chỉ có cách là làm sao để tác được số trong các cột C và D, sau đó dùng công thức. Mong mọi người bàn và giúp đỡ tiếp.

tigertiger đã viết:
cell D4 có dữ liệu: 2 người/3500000 đồng/tháng/1 người
thường thì tôi làm thế này thêm các ô phụ Vd: như F4=2,G4="người",H4=3500000,.... sau đó ô D4=F4&G4&H4&.... -> như thế khi này ta có thể dàng dùng phép nhân

cho hỏi thêm bạn:
+ D4= 2 người/3500000 đồng/tháng/1 người chính xác phải là 2 người * 3500000 đồng/tháng/người hoặc là 2 người*3500000 đồng/1 tháng/ 1 người ???
+ Liệu chỉ có phép nhân ko hay có khi lại có các phép tính khác như *, +, - vvv.. khi đó bài toán lại khác (chắc tôi đoán chỉ có phép nhân và chia thôi nhỉ) ???
+ Một điều nữa, đó là bạn có lặp đi lặp lại công việc này nhiều k? trong file bạn thường xử lý có nhiều dòng số liệu k? -> vì như thế cân nhắc có cần giải pháp triệt để hay chỉ một phần (chẳng hạn chỉ tách sô -> sau đó xử lý bước 2 bằng thao tác khác), tức là xét đến sự khả thi của giải pháp
+ cuối cùng là mong bạn mô tả rõ hơn và các trường hợp số liệu có thể xảy ra
Công việc ko lặp đi lặp lại nhiều lần. Hiện tại mình đang dùng mỗi phép nhân, nếu có thể mọi người giải quyết triệt để làm sao có thể thực hiện được tất cả các công thức,
Cảm ơn mọi người!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đơn giản nhất là FORMAT CUSTOM, thực hiện ghép chuỗi " &". sao này chỉ cần gõ con số, thì ô đó sẽ hiện đủ cả số lẫn chữ. Lúc này tính toán rất dễ dàng.Mặc dù hiện cả số và chữ nhưng ô đó vẫn là NUMBER.
 
0906732617 đã viết:
Đơn giản nhất là FORMAT CUSTOM, thực hiện ghép chuỗi " &". sao này chỉ cần gõ con số, thì ô đó sẽ hiện đủ cả số lẫn chữ. Lúc này tính toán rất dễ dàng.Mặc dù hiện cả số và chữ nhưng ô đó vẫn là NUMBER.

Nhưng nếu dữ liệu của bạn đó không đồng nhất về ký tự thì làm sao mà dùng đc format custom như bạn nói đc. Theo mình nên tổ chức dữ liệu lại thì tốt hơn
 
Nguyễn Hương Thơm đã viết:
Nhưng nếu dữ liệu của bạn đó không đồng nhất về ký tự thì làm sao mà dùng đc format custom như bạn nói đc. Theo mình nên tổ chức dữ liệu lại thì tốt hơn

+ Đúng là không đồng nhất - nhưng chính xác là "đơn vị" không đồng nhất (bộ, cái, tháng, người,....)-> customt fomat khó khả thi

+ Bố trí dữ liệu lại cũng là 1 giải pháp -> nhưng tác giả lại nói không thể bố trí lại được vì thế rất cực

+ Chắc là dùng VBA là giải quyết được, vấn đề ở đây là liên quan chuẩn hóa "đơn vị" thôi. Tigertiger đang đi theo hướng này, chắc là sẽ đạt kết quả,
minhnc đã viết:
Công việc ko lặp đi lặp lại nhiều lần. Hiện tại mình đang dùng mỗi phép nhân, nếu có thể mọi người giải quyết triệt để làm sao có thể thực hiện được tất cả các công thức,
Cảm ơn mọi người!
+ minhnc cho biết: trên thực tế có còn nhiều loại đơn vị ko? và các đơn vị này có thường thống nhất theo chuẩn nào k?

+ File này cột "đơn giá" như là "diễn toán" chứ ko phải đơn giá thì phải(???)

thế nhé minhnc trả lời sớm nhé, để đề ra giải pháp hợp lý
.
 
Tôi thì ko sợ đơn vị ko đồng nhất... mà ngán nhất cell D4..
Tôi nghĩ trong file thực tế chắc còn rất nhiều cái lộn xộn tương tự thế: Dấu / có khi hiểu là chia, nhưng có khi lại phải hiểu là nhân mới ác... vân vân và vân vân...
Thế thì đâu là nguyên tắc đễ ta bám vào nhỉ?
ANH TUẤN
 
minhnc đã viết:
Như salam thì ko nói làm gì.
Vì nội dung công việc khác nhau dẫn đến số lượng, đơn giá khác do vậy Tôi nghĩ chỉ có cách là làm sao để tác được số trong các cột C và D, sau đó dùng công thức. Mong mọi người bàn và giúp đỡ tiếp.
Tất nhiên một bài toán khó mới hay nhưng nó phải có một cái gì đó để ta định hướng giải quyết. Như file của bạn đưa lên ở cột đơn giá nó không có một quy luật hay một cái gì đó mà ta bám vào. Ở ô D4 đó nó như là một diễn giải.
2 người/350000 đồng .... 1/tháng có ý là 3500000*2 người * số tháng 2.5 =
có thể ô D5 của bạn lại ghi là tiền VND 3500000 đồng một tháng cho 5 người cộng thêm ngoài giờ 100000 gì đó nữa.
vậy thì toàn bộ số liệu của bạn tại cột đơn giá đó còn nhiều vấn đề nữa. Mình nghĩ đến VBA cũng khó mà làm được nên mới có ý bố trí lại số liệu trong file.
Vì số liệu bộ trí hợp lý sẽ tốt cho việc tính toán trích lọc được chính xác và nhanh chóng.
 
salam đã viết:
Tất nhiên một bài toán khó mới hay nhưng nó phải có một cái gì đó để ta định hướng giải quyết. Như file của bạn đưa lên ở cột đơn giá nó không có một quy luật hay một cái gì đó mà ta bám vào. Ở ô D4 đó nó như là một diễn giải.
2 người/350000 đồng .... 1/tháng có ý là 3500000*2 người * số tháng 2.5 =
Oh, chắc bạn minhnc viết nhầm 2 người/350000 đồng / ... phải chính xác là 2 người * 35000 đồng /... như thế thì mới tính được

anhtuan1066 đã viết:
Tôi thì ko sợ đơn vị ko đồng nhất... mà ngán nhất cell D4..
Tôi nghĩ trong file thực tế chắc còn rất nhiều cái lộn xộn tương tự thế: Dấu / có khi hiểu là chia, nhưng có khi lại phải hiểu là nhân mới ác... vân vân và vân vân...
Thế thì đâu là nguyên tắc đễ ta bám vào nhỉ?
ANH TUẤN

Đang có hướng rồi a tuấn, ta phải bám vào hệ thống hóa các đơn vị này a ah,
Chỉ còn vướng mắt một chút về chuẩn hóa bộ đơn vị này thôi,
 
Đã có giải pháp

Giải pháp rất ngắn gọn và XD thành hàm, với giải thuật chính là
+ Cho người dùng thiết lập thư viện Danh mục đơn vị (sử dụng trong bảng tính)
+ Hàm sẽ dò tìm và thay thế hết đơn vị có trong danh mục trên bằng "" - tức là xóa nó đi trong chuỗi.
+ cùng một số thủ thuật loại bỏ khoảng trắng, thay dấu "x" thành dấu "*" và xử lý dấu phân cách hàng ngàn.
+ kQ sau các xử lý trên là được chuỗi chứa các con số cùng các toán tử (có thể là +-*/ và "(" , ")" ) rồi dùng Evalute(<...>) để xác định giá trị này

Vì thế hàm có thể xử lý được các kiểu dữ liệu đơn vị bất kỳ miễn là có trong "Danh mục đơn vị" và các ký hiệu do gõ tắt nhầm như "/2 tháng" "/ 1tháng" hay là "/tháng" ...vvv
xem thêm trong file gửi kèm có giải thích để hiểu hơn

PHP:
Public Function GiaTri(StringTinhToan As String, Optional DauPcach000 = ",") As Double
    Application.Volatile
    Dim RgnDM As Range, iI As Integer, Dvi
    StringTinhToan = Replace(StringTinhToan, " ", ""): StringTinhToan = UCase(StringTinhToan)
    Set RgnDM = Range("DM")
    For Each Dvi In RgnDM: StringTinhToan = Replace(StringTinhToan, UCase(Dvi.Value), ""):  Next
    StringTinhToan = Trim(Replace(StringTinhToan, "X", "*"))
    StringTinhToan = Replace(StringTinhToan, DauPcach000, "")
    If DauPcach000 = "." Then StringTinhToan = Replace(StringTinhToan, ",", ".")
    If StringTinhToan = "1" Then StringTinhToan = "1*1"
    GiaTri = Evaluate(StringTinhToan)
End Function
về Hàm:
GiaTri(StringTinhToan , DauPcach000 )
Có 2 tham số
+ StringTinhToan chuỗi ký tự cần tính toán
+ DauPcach000 Dấu phân cách phần 1000 - mặc định là dấu "," nếu k nhập sẽ lấy giá trị mặc định là dấu "," - nếu DL là dấu "." Thì phải nhập vào là "." xem D7,E7 và D9,E9 và D10,E10

Về Dữ liệu
Nhập thỏa mãi các "đơn vị" miễn là các "đơn vị" này có bổ sung bên Thư viện trong cột Danh mục
cho phép sử dấu chữ "x" thay cho dấu "*" và KHông phân biệt hoa thường so với danh mục bên thư viện

Về thư viện Danh mục các đơn vị (trong sheet THUVIEN)
Đây chính là nơi cập nhập bổ sung các đơn vị được sử dung
Nhập danh mục các đơn vị ở đây, chú ý: ký hiệu cung đơn vị thì ký hiệu dài nhập trước "/tháng" phải được nhập trước "tháng"

chữ "đồng" nên để trước "đ"
có thể bổ sung thêm đơn vị thoải mãi vào cột

xem thêm trong file gửi kèm có giải thíc đẩy đủ để hiểu hơn

hy vọng là như ý bạn minhnc
.
 

File đính kèm

Không thấy minhnc ý kiến thế nòa nhỉ, kết quả như thế nào,
Bạn có nhận thấy điều gì bất tiện ko?
Nhất đây cũng bàn lun, có lẽ:
Giải thuật nhanh hơn nữa là thay đổi tất cả thành "" trừ "số, dấu âm (ngay sau nó có số) và các toán tử như +-*/...
-> chuỗi còn lại là số và toán tử -> evaluate là được
thì khi đó ko cần lập Danh mục đơn vị nữa. bài này khá hay các cao thủ cho ý kiến xem sao???
 
Lần chỉnh sửa cuối:
Cảm ơn tigertiger nhiều. Sau khi anh post bài tôi có nhấn nút thank và có 1 bài viết về vấn đề này, ko hiểu sao mấy hôm quay lại chỉ thấy nút thạnk được còn bài viết ko thấy đâu????
Thục sự là rất cảm ơn mọi người đã rất nhiệt tình giải quyết 1 vấn đề mà lâu nay tôi nghĩ chỉ có mấy anh Trung Quốc mới làm được, Là thế này, tôi thấy bảng chào thầu của thằng tàu nó cũng có bảng như thế, ko hiều sao?? . Nhưng ở GFE mọi người đã giải quyết được vấn đề 1 cách triệt để. Chỉ có điều là thêm 1 sheet thư viện nữa. Trong file của thằng TQ ko có điều đó mà nó vẫn làm được, có thể xong rồi nó chỉ copy number thôi.
Lần nữa cảm ơn mọi người, đặc biệt là tigertiger nhiều nhiều.>@@@@
 
Dựa vào code của bác TigerTiger, tôi cũng xin mạnh dạn góp 1 hàm tính toán. Hàm của tôi không cần đến thư viện. Khi áp dụng vào file của bác TigerTiger thì thấy kết quả ra cũng đúng. Do chưa thử hết tất cả các trường hợp nên không biết hàm của tôi có lỗi gì hay không. Nhờ các bác kiểm tra giúp.
PHP:
Public Function Gtri(Dulieu As String, Optional Pcach = ",")
If Len(Dulieu) = 0 Then Exit Function
For i = 1 To Len(Dulieu)
    If Pcach = "." Then
        If Mid(Dulieu, i, 1) = "," Then temp = temp & "."
    Else
        If Mid(Dulieu, i, 1) = "." Then temp = temp & "."
    End If
    If Mid(Dulieu, i, 1) = "x" Then temp = temp & "*"
    If Mid(Dulieu, i, 1) = ":" Then temp = temp & "/"
    Select Case Mid(Dulieu, i, 1)
        Case "+", "-", "*", "/", "(", ")", 0 To 9
            temp = temp & Mid(Dulieu, i, 1)
    End Select
Next
For i = 1 To Len(Dulieu)
    If Right(temp, 1) = "-" Or Right(temp, 1) = "+" _
        Or Right(temp, 1) = "*" Or Right(temp, 1) = "/" Then _
        temp = Left(temp, Len(temp) - 1)
Next
Gtri = Evaluate(temp)
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
minhlev đã viết:
Dựa vào code của bác TigerTiger, tôi cũng xin mạnh dạn góp 1 hàm tính toán. Hàm của tôi không cần đến thư viện. Khi áp dụng vào file của bác TigerTiger thì thấy kết quả ra cũng đúng. Do chưa thử hết tất cả các trường hợp nên không biết hàm của tôi có lỗi gì hay không. Nhờ các bác kiểm tra giúp.
PHP:
Public Function Gtri(Dulieu As String, Optional Pcach = ",")
If Len(Dulieu) = 0 Then Exit Function
For i = 1 To Len(Dulieu)
    If Pcach = "." Then
        If Mid(Dulieu, i, 1) = "," Then temp = temp & "."
    Else
        If Mid(Dulieu, i, 1) = "." Then temp = temp & "."
    End If
    If Mid(Dulieu, i, 1) = "x" Then temp = temp & "*"
    If Mid(Dulieu, i, 1) = ":" Then temp = temp & "/"
    Select Case Mid(Dulieu, i, 1)
        Case "+", "-", "*", "/", "(", ")", 0 To 9
            temp = temp & Mid(Dulieu, i, 1)
    End Select
Next
For i = 1 To Len(Dulieu)
    If Right(temp, 1) = "-" Or Right(temp, 1) = "+" _
        Or Right(temp, 1) = "*" Or Right(temp, 1) = "/" Then _
        temp = Left(temp, Len(temp) - 1)
Next
Gtri = Evaluate(temp)
End Function

+ Rất hay, cám ơn minhlev

+ tigertiger chỉ cho hợp lý về logic lệnh hơn, đã đung case thì dùng chung lun (bỏ IF), và rút ngắn hơn

PHP:
Public Function Gtr(Dulieu As String, Optional Pcach = ",")
If Len(Dulieu) = 0 Then Exit Function

 Dulieu = Replace(Dulieu, Pcach, "")
 Dulieu = Replace(Dulieu, ",", ".")
  For i = 1 To Len(Dulieu)
    Select Case Mid(Dulieu, i, 1)
        Case "x": temp = temp & "*"
        Case ":": temp = temp & "/"
        Case "+", "-", "*", "/", "(", ")", 0 To 9:        temp = temp & Mid(Dulieu, i, 1)
    End Select
  Next i
For i = 1 To Len(Dulieu)
    If Right(temp, 1) = "-" Or Right(temp, 1) = "+" _
        Or Right(temp, 1) = "*" Or Right(temp, 1) = "/" Then _
       temp = Left(temp, Len(temp) - 1)
Next
Gtr = Evaluate(temp)
End Function

mong nhận được đóng góp hoàn thiện
 
Cảm ơn bác TigerTiger, xin được chỉnh code của bác thêm 1 chút nữa. Cụ thể:
- Ở dòng thứ 10 thêm "."
- Chuyển nốt đoạn If ở cuối code thành Select Case.
PHP:
Public Function Gtr(Dulieu As String, Optional Pcach = ",")
Dim i, temp
If Len(Dulieu) = 0 Then Exit Function
Dulieu = Replace(Dulieu, Pcach, "")
Dulieu = Replace(Dulieu, ",", ".")
For i = 1 To Len(Dulieu)
    Select Case Mid(Dulieu, i, 1)
        Case "x": temp = temp & "*"
        Case ":": temp = temp & "/"
        Case "+", "-", "*", "/", "(", ")", ".", 0 To 9:   temp = temp & Mid(Dulieu, i, 1)
    End Select
Next i
For i = 1 To Len(Dulieu)
    Select Case Right(temp, 1)
        Case "-", "+", "*", "/":    temp = Left(temp, Len(temp) - 1)
    End Select
Next
Gtr = Evaluate(temp)
End Function
 
Lần chỉnh sửa cuối:
minhnc đã viết:
Cảm ơn tigertiger nhiều. Sau khi anh post bài tôi có nhấn nút thank và có 1 bài viết về vấn đề này, ko hiểu sao mấy hôm quay lại chỉ thấy nút thạnk được còn bài viết ko thấy đâu????
Thục sự là rất cảm ơn mọi người đã rất nhiệt tình giải quyết 1 vấn đề mà lâu nay tôi nghĩ chỉ có mấy anh Trung Quốc mới làm được, Là thế này, tôi thấy bảng chào thầu của thằng tàu nó cũng có bảng như thế, ko hiều sao?? . Nhưng ở GFE mọi người đã giải quyết được vấn đề 1 cách triệt để. Chỉ có điều là thêm 1 sheet thư viện nữa. Trong file của thằng TQ ko có điều đó mà nó vẫn làm được, có thể xong rồi nó chỉ copy number thôi.
Lần nữa cảm ơn mọi người, đặc biệt là tigertiger nhiều nhiều.>@@@@
Đúng là mấy thằng nước ngoài thì làm hay rồi, nhưng không có gì họ làm đượ mà mình không thể chỉ có điều mình có chịu làm không thôi.
 
Anh ơi , khi ta dung cú pháp này : thì chuỗi 1234abcd sẽ thành 1234, nhưng nếu có thêm số 0 nữa nghĩa là : 01234abcd thì nó ko lấy cả số 0, vẫn 1234. Anh giúp em với ^^. Em muốn lấy toàn bộ chữ số có trong chuỗi ạ
 

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

Back
Top Bottom