Dùng code thế nào để chuyển giá trị NUMBER thành TEXT

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,952
Tôi có 1 bảng tính, trong vùng A1:H20 chứa các giá trị NUMBER... Xin hỏi các bạn tôi phải dùng code gì để biến chúng thành TEXT
Hiện tại tôi đang dùng For quét qua các cell như sau:
PHP:
Option Explicit
Sub ConvertToText()
 Dim Clls As Range
 For Each Clls In [A1].CurrentRegion
   Clls.NumberFormat = "@"
   Clls.Value = Format(Clls, "@")
 Next
End Sub
Với dử liệu ít thì không có vấn đề, nhưng với dử liệu lớn hơn thì code này chạy rất chậm!
Vậy ngoài cách dùng For như trên còn cách nào khác khả thi hơn không?
Cãm ơn!
 

File đính kèm

Tôi có 1 bảng tính, trong vùng A1:H20 chứa các giá trị NUMBER... Xin hỏi các bạn tôi phải dùng code gì để biến chúng thành TEXT
Hiện tại tôi đang dùng For quét qua các cell như sau:
PHP:
Option Explicit
Sub ConvertToText()
 Dim Clls As Range
 For Each Clls In [A1].CurrentRegion
   Clls.NumberFormat = "@"
   Clls.Value = Format(Clls, "@")
 Next
End Sub
Với dử liệu ít thì không có vấn đề, nhưng với dử liệu lớn hơn thì code này chạy rất chậm!
Vậy ngoài cách dùng For như trên còn cách nào khác khả thi hơn không?
Cãm ơn!
Bạn chọn vùng cần chuyển, xong chạy thủ tục:
Mã:
Sub ConvertToText()
Selection.NumberFormat = "@"
End Sub
 
Upvote 0
Tôi có 1 bảng tính, trong vùng A1:H20 chứa các giá trị NUMBER... Xin hỏi các bạn tôi phải dùng code gì để biến chúng thành TEXT
Hiện tại tôi đang dùng For quét qua các cell như sau:
PHP:
Option Explicit
Sub ConvertToText()
 Dim Clls As Range
 For Each Clls In [A1].CurrentRegion
   Clls.NumberFormat = "@"
   Clls.Value = Format(Clls, "@")
 Next
End Sub
Với dử liệu ít thì không có vấn đề, nhưng với dử liệu lớn hơn thì code này chạy rất chậm!
Vậy ngoài cách dùng For như trên còn cách nào khác khả thi hơn không?
Cãm ơn!
Bác dùng code sau thử.
PHP:
Sub ConvertToText01()
Dim MyRng As Range
Set MyRng = [A1].CurrentRegion
With MyRng
    .NumberFormat = "@"
End With
Set MyRng = Nothing
End Sub
 
Upvote 0
Các Bác cho em góp thêm tí ý kiến, những vấn đề này mình có thể giải quyết đơn giản hơn mà. Em dùng cách như sau thôi:

B1: Copy các cell chứa dữ liệu số, Paste vào Notepad.
B2: Format các cell thành Text.
B3: Copy từ Notepad, Paste lại vào các cell vừa xong.
Thế là OK các Bác ạ.
 
Upvote 0
Các Bác cho em góp thêm tí ý kiến, những vấn đề này mình có thể giải quyết đơn giản hơn mà. Em dùng cách như sau thôi:

B1: Copy các cell chứa dữ liệu số, Paste vào Notepad.
B2: Format các cell thành Text.
B3: Copy từ Notepad, Paste lại vào các cell vừa xong.
Thế là OK các Bác ạ.
Ví các bạn muốn viết code, đơn giản nhất là các bạn chọn vùng > Menu Format > Cells > thẻ Number > chọn Text > OK
 
Upvote 0
Không đơn giản thế đâu!
- Tại 1 cell trống nào đó, ta Format cho cell trước, sau đó nhập số vào thì mọi chuyện bình thường ---> Nó sẽ lấy theo Format Cells trước đó
- Nhưng nếu cell đang chứa Number, được Format General, giờ ta chuyển Format cell thành TEXT thì chẳng qua ta nhìn thấy số được canh lề trái mà thôi ---> Format gốc không hề thay đổi
Các bạn cứ thử dùng hàm ISTEXT hoặc ISNUMBER để kiểm tra sẽ biết
Tôi cũng đang nghĩ đến hướng sẽ copy dử liệu sang vùng tạm ---> Xóa vùng dử liệu ---> Format lại ---> Paste ngược vào ---> DÀI DÒNG QUÁ!
Tóm lại các bạn làm thế nào mà sau khi chạy code xong, ta nhìn thấy được dấu hiệu tam giác màu xanh nằm ở góc trên bên trái là ăn tiền
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi có 1 bảng tính, trong vùng A1:H20 chứa các giá trị NUMBER... Xin hỏi các bạn tôi phải dùng code gì để biến chúng thành TEXT
Hiện tại tôi đang dùng For quét qua các cell như sau:
PHP:
Option Explicit
Sub ConvertToText()
 Dim Clls As Range
 For Each Clls In [A1].CurrentRegion
   Clls.NumberFormat = "@"
   Clls.Value = Format(Clls, "@")
 Next
End Sub
Với dử liệu ít thì không có vấn đề, nhưng với dử liệu lớn hơn thì code này chạy rất chậm!
Vậy ngoài cách dùng For như trên còn cách nào khác khả thi hơn không?
Cãm ơn!

Không biết cái này có dùng được không nữa :
PHP:
Set Rng=Selection
Selection.clear
selection=Rng.value
 
Upvote 0
Mình không hiểu ý bạn lắm, tại sao bạn lại không dùng hàm Text() hay hàm Fixed() ngay trong trang tính, mình thử khoang 3000 dòng thấy cũng nhanh.
 
Upvote 0
Không biết cái này có dùng được không nữa :
PHP:
Set Rng=Selection
Selection.clear
selection=Rng.value
Cái này thử rồi.. có lẽ bạn hoangdanh muốn thế này chăng:
PHP:
Sub ConvertToText()
 Dim Rng As Variant
 Rng = Selection.Value
 Selection.Clear
 Selection.Value = Rng
End Sub
---> Nhưng không ăn thua
Mình không hiểu ý bạn lắm, tại sao bạn lại không dùng hàm Text() hay hàm Fixed() ngay trong trang tính, mình thử khoang 3000 dòng thấy cũng nhanh.
Anh ơi, dử liệu đang có sẳn và rất nhiều nữa... Giờ dùng hàm TEXT gì đó chẳng lẻ phải chuyển nó sang 1 vùng phụ nào đó sao?
---> Em muốn dùng 1 code gì đó, miển sao bấm phát là toàn bộ number sẽ chuyển thành text ---> TEXT THẬT SỰ (được kiểm tra bằng hàm ISTEXT)
 
Upvote 0
Nếu không cần giữ dấu phân cách thì cứ thêm dấu nháy đơn vào là chắc ăn nhất
Clls.value="'" & Clls
 
Upvote 0
Cái này thử rồi.. có lẽ bạn hoangdanh muốn thế này chăng:
PHP:
Sub ConvertToText()
 Dim Rng As Variant
 Rng = Selection.Value
 Selection.Clear
 Selection.Value = Rng
End Sub
---> Nhưng không ăn thua

Anh ơi, dử liệu đang có sẳn và rất nhiều nữa... Giờ dùng hàm TEXT gì đó chẳng lẻ phải chuyển nó sang 1 vùng phụ nào đó sao?
---> Em muốn dùng 1 code gì đó, miển sao bấm phát là toàn bộ number sẽ chuyển thành text ---> TEXT THẬT SỰ (được kiểm tra bằng hàm ISTEXT)

Theo em thì bản thân dữ liệu là số thì dù cho anh có định dạng vùng kiểu gì thì nó vẫn là số.
Chỉ khi nào anh định dạng trực tiếp cho giá trí đó thì nó mới là text thực sự.

Có hàm Format nhưng chỉ dùng 1 lúc cho 1 cell thôi. Vậy chỉ có cách dùng Specialcell với constant number kết hợp với for each và format là nhanh nhất.
 
Upvote 0
Ai cha cha...
Việc convert TEXT TO NUMBER có thể làm 1 nhát mà chẳng cần vòng lập nào ---> Nó dể dàng bao nhiêu thì điều ngược lại khó ăn bấy nhiêu!
Chẳng lẽ hỏng có cách nào (ngoại trừ vòng lập quét qua các cells) sao ta!
Hic....
 
Upvote 0
Bạn dùng thử code sau, tôi test với 10.000 dòng, 100 cột thấy chạy mất khoảng 1phút.
Mã:
Private Sub CommandButton1_Click()
Dim sh As Worksheet
Dim ra As Range, Rng As Range
Dim va As Variant
Dim k As Long, i As Long, sCol As Long
    Set sh = ActiveSheet
    Set ra = sh.Range("myRange")
    sCol = ra.Columns.Count
    Application.StatusBar = Format(Now(), "hh:mm:ss")
    Application.ScreenUpdating = False
    For k = 1 To sCol
        Set Rng = ra.Columns(k)
        va = Rng
        For i = LBound(va) To UBound(va)
            va(i, 1) = "'" & va(i, 1)
        Next
        Rng = va
    Next
    MsgBox Format(Now(), "hh:mm:ss")
    Application.StatusBar = False
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Bạn dùng thử code sau, tôi test với 10.000 dòng, 100 cột thấy chạy mất khoảng 1phút.
Mã:
Private Sub CommandButton1_Click()
Dim sh As Worksheet
Dim ra As Range, Rng As Range
Dim va As Variant
Dim k As Long, i As Long, sCol As Long
    Set sh = ActiveSheet
    Set ra = sh.Range("myRange")
    sCol = ra.Columns.Count
    Application.StatusBar = Format(Now(), "hh:mm:ss")
    Application.ScreenUpdating = False
    For k = 1 To sCol
        Set Rng = ra.Columns(k)
        va = Rng
        For i = LBound(va) To UBound(va)
            va(i, 1) = "'" & va(i, 1)
        Next
        Rng = va
    Next
    MsgBox Format(Now(), "hh:mm:ss")
    Application.StatusBar = False
    Application.ScreenUpdating = True
End Sub
Bạn ơi! Vấn đề không phải nằm ở chổ GIÃI BÀI TOÁN (vì đã giãi rồi) .. mà là TÌM GIÃI PHÁP TỐI ƯU
Nếu dùng For duyệt hết các cell thì... Không còn gì để nói nữa cả
 
Upvote 0
Cái này chạy mất khoảng 10s:
Mã:
Private Sub Number2Text()
Dim s1 As Worksheet, s2 As Worksheet
Dim r1 As Range, r2 As Range
Dim va()
Dim sRow As Long, sCol As Long
    'On Error Resume Next
    Application.StatusBar = Format(Now(), "hh:mm:ss")
    Application.ScreenUpdating = False
    Set s1 = ActiveSheet
    Set r1 = s1.Range("myRa")   'Selection
    sCol = r1.Columns.Count
    sRow = r1.Rows.Count
    
    Set s2 = ActiveWorkbook.Sheets.Add
    Set r2 = s2.Range("A1").Resize(sRow, sCol)
    r2.NumberFormat = "@"
    va = r1
    r2 = va
    r2.Copy Destination:=r1
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
        s2.Delete
    Application.DisplayAlerts = True
    Set s1 = Nothing: Set s2 = Nothing: Set r1 = Nothing: Set r2 = Nothing
    MsgBox Format(Now(), "hh:mm:ss")
    Application.StatusBar = False
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Cái này chạy mất khoảng 10s:
Mã:
Private Sub Number2Text()
....
End Sub
Code này nhanh chậm tôi chưa thử... nhưng chắc ăn là nó chẳng chuyển NUM thành TEXT tí nào!
Bạn cứ kiểm tra lại, nếu hàm ISTEXT trả về kết quả = TRUE thì OK (tôi kiểm tra thấy nó FALSE tất tần tật)
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dựa vào gợi ý này:
Các Bác cho em góp thêm tí ý kiến, những vấn đề này mình có thể giải quyết đơn giản hơn mà. Em dùng cách như sau thôi:

B1: Copy các cell chứa dữ liệu số, Paste vào Notepad.
B2: Format các cell thành Text.
B3: Copy từ Notepad, Paste lại vào các cell vừa xong.
Thế là OK các Bác ạ.
----> Copy vùng dử liệu sang nơi khác để xử lý
Và gợi ý này:
Mình không hiểu ý bạn lắm, tại sao bạn lại không dùng hàm Text() hay hàm Fixed() ngay trong trang tính, mình thử khoang 3000 dòng thấy cũng nhanh.
----> Dùng hàm TEXT của Excel để Convert
Tôi đã làm như sau:
PHP:
Option Explicit
Sub ConvertToText()
  Dim TempRng As Range, Original As Range
  Application.ScreenUpdating = False
  Set Original = ActiveCell
  With Sheet1.[A1].CurrentRegion
    Set TempRng = .Offset(, .Columns.Count).Resize(.Rows.Count, .Columns.Count)
    .NumberFormat = "@"
    TempRng.FormulaArray = "=TEXT(" & .Address & ",""@"")"
    TempRng.Copy
    TempRng.PasteSpecial 3
    .PasteSpecial 3
    TempRng.Clear
  End With
  Application.ScreenUpdating = True
  Original.Select
End Sub
Tôi không copy sang ứng dụng khác mà copy vào 1 vùng tạm----> sau đó dùng hàm TEXT xử lý ---> Copy dử liệu vừa xử lý và paste ngược về
Qua kiểm tra trên mấy tính tốc độ 2 GHz, với vùng dử liệu 20.000 dòng, 50 cột cho kết quả < 3s
Cãm ơn mọi người đã trợ giúp!
Đặc biệt cãm ơn đến anh Sealandcop_kh
 

File đính kèm

Upvote 0
Để đạt được tốc độ nhanh hơn thì dùng kỹ thuật MultiThread. Hiểu đơn giản về kỹ thuật này là chia khối công việc thành nhiều phần và cho thực hiện cùng một lúc. Các bác cứ nhìn cách làm việc của PM download IDM, nó táck file ra làm các phần rồi cùng cho thực hiện mục lúc, và so sánh với cách mà Windows làm.
 
Upvote 0
Để đạt được tốc độ nhanh hơn thì dùng kỹ thuật MultiThread. Hiểu đơn giản về kỹ thuật này là chia khối công việc thành nhiều phần và cho thực hiện cùng một lúc. Các bác cứ nhìn cách làm việc của PM download IDM, nó táck file ra làm các phần rồi cùng cho thực hiện mục lúc, và so sánh với cách mà Windows làm.
Tuân ơi... với VBA thì tôi như là dân ngoại đạo (còn ngu lắm)
Bạn có thể gợi ý thêm tí được không? Miển sao đạt được yêu cầu về tốc độ
Code tôi vừa làm xong ở trên tuy nhanh hơn trước nhưng thực chất vẩn chưa nhanh đâu (nhất là khi ráp vào 1 số file mà bên trong đã có công thức)
 
Upvote 0
Web KT

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

Back
Top Bottom