Nhờ viết macro đổi sô thành số La mã

Liên hệ QC

longlt08

Thành viên thường trực
Tham gia
23/3/08
Bài viết
321
Được thích
400
Xin chào GPE !
Nhờ các anh, chị viết giúp cho mình 1 macro đổi số thành số La mã. Xin cảm ơn mọi người (có file gửi kèm theo)
 

File đính kèm

Excel đã có hàm Roman đổi số rồi bạn!
 
Upvote 0
Xin chào GPE !
Nhờ các anh, chị viết giúp cho mình 1 macro đổi số thành số La mã. Xin cảm ơn mọi người (có file gửi kèm theo)
Bạn dùng UDF sau nhé
Mã:
Function Num2Roman(ByVal N As Integer) As String

        Const Digits = "IVXLCDM"

        Dim I As Integer, Digit As Integer, Temp As String

        I = 1
        Temp = ""
        Do While N > 0
          Digit = N Mod 10
          N = N \ 10
          Select Case Digit
            Case 1
              Temp = Mid(Digits, I, 1) & Temp
            Case 2
              Temp = Mid(Digits, I, 1) & Mid(Digits, I, 1) & Temp
            Case 3
              Temp = Mid(Digits, I, 1) & Mid(Digits, I, 1) & _
                     Mid(Digits, I, 1) & Temp
            Case 4
              Temp = Mid(Digits, I, 2) & Temp
            Case 5
              Temp = Mid(Digits, I + 1, 1) & Temp
            Case 6
              Temp = Mid(Digits, I + 1, 1) & Mid(Digits, I, 1) & Temp
            Case 7
              Temp = Mid(Digits, I + 1, 1) & Mid(Digits, I, 1) & _
                     Mid(Digits, I, 1) & Temp
            Case 8
              Temp = Mid(Digits, I + 1, 1) & Mid(Digits, I, 1) & _
                     Mid(Digits, I, 1) & Mid(Digits, I, 1) & Temp
            Case 9
              Temp = Mid(Digits, I, 1) & Mid(Digits, I + 2, 1) & Temp
          End Select
          I = I + 2
        Loop
        Num2Roman = Temp
      End Function
Cú Pháp:

=Num2Roman(SoCanChuyen)

Excel đã có hàm Roman đổi số rồi bạn!
Hình như là số trong Excel chỉ chuyển được đến số 3999 hà anh ơi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Với yêu cầu của bạn thì quý chỉ có 4 chữ số, vậy thì dùng công thức cũng được chứ dùng Macro cho mệt
Tại C3 gõ công thức: =CHOOSE(B3,"I","II","III","IV") rồi Filldown là được.

Trời! Gửi xong mới đọc bài của Bác Ptm. Hàm Roman là quá "ngon" rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
Sưu tầm hàm chuyển đổi

Mã:
' Formats a number as a roman numeral.
' Author: Christian d'Heureuse (www.source-code.biz)
Public Function FormatRoman(ByVal n As Integer) As String
   If n = 0 Then FormatRoman = "0": Exit Function
      ' There is no roman symbol for 0, but we don't want to return an empty string.
   Const r = "IVXLCDM"              ' roman symbols
   Dim i As Integer: i = Abs(n)
   Dim s As String, p As Integer
   For p = 1 To 5 Step 2
      Dim d As Integer: d = i Mod 10: i = i \ 10
      Select Case d                 ' format a decimal digit
         Case 0 To 3: s = String(d, Mid(r, p, 1)) & s
         Case 4:      s = Mid(r, p, 2) & s
         Case 5 To 8: s = Mid(r, p + 1, 1) & String(d - 5, Mid(r, p, 1)) & s
         Case 9:      s = Mid(r, p, 1) & Mid(r, p + 2, 1) & s
         End Select
      Next
   s = String(i, "M") & s           ' format thousands
   If n < 0 Then s = "-" & s        ' insert sign if negative (non-standard)
   FormatRoman = s
   End Function

Thử ví dụ trên:
Mã:
' Writes a list of roman numerals into a text file.
' The output can be used as a "decimal to roman" conversion table.
Public Sub PrintToFile(ByVal FileName, Optional ByVal First = 1, Optional ByVal Last = 2100)
   Dim fh: fh = FreeFile
   Open FileName For Output As fh
   Dim i As Integer
   For i = First To Last
      Print #fh, i & " = " & FormatRoman(i)
      Next
   Close #fh
   End Sub
 
Upvote 0
Nếu tôi nhớ không lầm thì hàm này chỉ có giới hạn tại số 3999 mà thôi, từ 4000 trở lên lỗi Value!
Đương nhiên... chính vậy mới có hàm tự tạo của levanduyet...
Tuy nhiên, cũng chẳng thấy ai xài số LA MÃ đến cở 1000... Hic... Làm chi cho cực thân
 
Upvote 0
Nếu tôi nhớ không lầm thì hàm này chỉ có giới hạn tại số 3999 mà thôi, từ 4000 trở lên lỗi Value!

Xin thưa: Anh Minhthien cho em biết các số sau viết theo số La Mã thế nào ạ?
- 4.000
- 4.001
- 5.000
- 10.000

Trong hệ ghi số La Mã có các ký tự chữ cái thay cho số, theo quy ước 4 chữ cái thì đổi thành 1 chữ cái + 1 chữ cái cấp kế tiếp, . . ., Vậy xin hỏi chữ cái cấp kế tiếp của M là chữ gì ạ? Thầy Minh Thiện làm ơn nhé!

PS:
1. Hàm của Domfootwear:
16.000 = 11.000 = 9.000 = 4.000 = 1.000 = M
5.000 = ""

2. Hàm của Lvd:

4.000 = MMMM
5.000 = MMMMM
6.000 = MMMMMM
15.000 = MMMMMMMMMMMMMMM
30.000 = MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
...
 
Lần chỉnh sửa cuối:
Upvote 0
Sư phụ ơi, đừng nói vậy làm em tổn thọ!
Mọi người coi trong HELP sẽ biết tại sao như vậy!
ROMAN function
Converts an arabic numeral to roman, as text.
ROMAN(number,form)
Number is the Arabic numeral you want converted.
Form is a number specifying the type of roman numeral you want. The roman numeral style ranges from Classic to Simplified, becoming more concise as the value of form increases. See the example following
ROMAN(499,0)below.

Form Type
0 or omitted Classic.
1 More concise. See example below.
2 More concise. See example below.
3 More concise. See example below.
4 Simplified.
TRUE Classic.
FALSE Simplified.
Remarks
If number is negative, the #VALUE! error value is returned.
If number is greater than 3999, the #VALUE! error value is returned.
Example
Formula Description (Result)
=ROMAN(499,0) Classic roman numeral style for 499 (CDXCIX)
=ROMAN(499,1) More concise version for 499 (LDVLIV)
=ROMAN(499,2) More concise version for 499 (XDIX)
=ROMAN(499,3) More concise version for 499 (VDIV)
=ROMAN(499,4) More concise version for 499 (ID)
=ROMAN(2013,0) Classic roman numeral style for 2013 (MMXIII)
 
Upvote 0
Sư phụ ơi, đừng nói vậy làm em tổn thọ!
Mọi người coi trong HELP sẽ biết tại sao như vậy!

Dạ thưa em hỏi thật, thầy vui lòng trả lời ạ, trả lời đúng câu hỏi ạ!

Roman() của Excel chỉ tới 3.999, thì em biết đọc Help ạ, còn em hỏi ngoài đời cơ.

1. các số sau viết theo số La Mã thế nào?
- 4.000
- 4.001
- 5.000
- 10.000

2. Trong hệ ghi số La Mã có các ký tự chữ cái thay cho số, theo quy ước 4 chữ cái thì đổi thành 1 chữ cái + 1 chữ cái cấp kế tiếp, . . ., Vậy xin hỏi chữ cái cấp kế tiếp của M là chữ gì?
 
Lần chỉnh sửa cuối:
Upvote 0
1. Hàm của Domfootwear:
16.000 = 11.000 = 9.000 = 4.000 = 1.000 = M
5.000 = ""

2. Hàm của Lvd (không phải của em, hi hi hi):

4.000 = MMMM
5.000 = MMMMM
6.000 = MMMMMM
15.000 = MMMMMMMMMMMMMMM
30.000 = MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
...


À em đã tìm ra ở đây rồi.

romannumber.jpg


Vậy các số mà em tô màu vàng thì làm sao nhỉ??? Ngay cả trang này tổng hợp các funtions em thấy cũng không đúng theo trường hợp em tô màu vàng.

Còn 4000 theo cái này
roman1.jpg

Em nghĩ là đúng.

Vậy hàm ở trên sẽ chỉ đúng từ 4000 trở lại mà thôi. Chắc có lẻ thế mà có giới hạn của hàm Roman
If number is greater than 3999, the #VALUE! error value is returned.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ thưa em hỏi thật, thầy vui lòng trả lời ạ, trả lời đúng câu hỏi ạ!

Roman() của Excel chỉ tới 3.999, thì em biết đọc Help ạ, còn em hỏi ngoài đời cơ.

Em chịu, không có trình độ hiểu biết để trả lời, tuy nhiên, tính trong Excel thôi đã có 5 kiểu viết từ 0 -> 4 rồi thì ngoài đời lấy gì làm chuẩn đây??
 
Upvote 0
Vậy theo anh: 4.000 = MMMM có đúng không? Nếu không đúng thì như thế nào mới đúng. Thú thiệt mấy cái này em chẳng đụng đến bao giờ.

Lê Văn Duyệt

Nếu, (nếu trên đời), nếu có ký tự tương ứng với 5.000, giả sử T, thì 4.000 = MT
 
Lần chỉnh sửa cuối:
Upvote 0
Xin thưa: Anh Minhthien cho em biết các số sau viết theo số La Mã thế nào ạ?
- 4.000
- 4.001
- 5.000
- 10.000

Trong hệ ghi số La Mã có các ký tự chữ cái thay cho số, theo quy ước 4 chữ cái thì đổi thành 1 chữ cái + 1 chữ cái cấp kế tiếp, . . ., Vậy xin hỏi chữ cái cấp kế tiếp của M là chữ gì ạ? Thầy Minh Thiện làm ơn nhé!

PS:
1. Hàm của Domfootwear:
16.000 = 11.000 = 9.000 = 4.000 = 1.000 = M
5.000 = ""

2. Hàm của Lvd:

4.000 = MMMM
5.000 = MMMMM
6.000 = MMMMMM
15.000 = MMMMMMMMMMMMMMM
30.000 = MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
...
_
V là cấp kế tiếp của M. Mỗi chữ cái có dấu ngang trên đầu biểu thị cho phép nhân 1.000
_
V = 5.000
_
X = 10.000
_
L = 50.000
_
C = 100.000
_
D = 500.000
_
M = 1.000.000
Nguồn Wikipedia
Nếu, (nếu trên đời), nếu có ký tự tương ứng với 5.000, giả sử T, thì 5.000 = MT
Chỗ màu đỏ là 4.000 mới đúng chứ.
 
Lần chỉnh sửa cuối:
Upvote 0
Đấy, ý của tôi là vậy, như HuuThang trả lời.

Vấn đề là số La Mã rất ít thông dụng, hiện nay chỉ còn dùng để đánh số thứ tự trình bày văn bản, ghi trên mặt số đồng hồ, ghi số thứ tự Nữ hoàng (Elizabeth I, Elizabeth II), thứ tự Hồng Y Giáo chủ, ... Ít ai dùng số lớn. Do đó anh Bill viết hàm Roman chỉ đến đó thôi. Vả lại, Chữ số La Mã Cổ Đại chỉ có bấy nhiêu, số 4000 trở lên là cải tiến sau này.
Các ký tự có gạch trên đầu và gạch dưới chân hình như cũng không có trong bảng mã Unicode thì phải. Thế nên, dùng hàm UDF làm gì nếu cũng chỉ thể hiện được đến số 3.999? Số lớn hơn không thể hiện được xuống cell?? Chả lẽ dùng symbol hoặc Equation?

Kết luận: Nếu không có hàm tự viết hoặc biện pháp nào khác, thì xài Roman() cho khoẻ! Còn không biết trên đời có gì thì đừng chê!
 
Upvote 0
Xin chào GPE !
Nhờ các anh, chị viết giúp cho mình 1 macro đổi số thành số La mã. Xin cảm ơn mọi người (có file gửi kèm theo)

Bạn thử cái này (nó chỉ đúng với số <4000 - chắc là do mặc định của hàm Romand trong Excel)

PHP:
Sub Romand()
For Each cls In [b3:b4000].SpecialCells(2)
   cls(1, 2) = Application.Roman(cls)
Next
End Sub
 
Upvote 0
Hi TrungChinh,

Chắc chưa đọc hết các thread ở trên nhỉ...

LVD
 
Upvote 0
Web KT

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

Back
Top Bottom