Gà excel muốn hỏi: nối chuỗi và format từng ký tự (ký số)

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Em gà lắm nhờ các bác giúp bằng VBA ạ,
Em có các ô :
A1, B1, C1 chứa ký tự là A,B,C format font từng màu khác nhau
A2, B2, C2 chứa ký số (VD: 1,2,3) format font từng màu khác nhau

Kết quả muốn có:
Ô D1 là chuỗi nối "ABC", và từng ký tự được format tương ứng
Ô D2 là chuỗi nối 123, và từng ký số được format tương ứng

Các cao thủ cho em xin 1 đoạn code để làm được việc đó ạ.
Ô D1 em có thể làm được, nhưng ô D2 thì đang vướng ạ.
1322

Em xin cảm ơn và mong mỏi được chỉ giáo.

Sub concatenate_cells_formats(cell As Range, source As Range)
'Anon

Dim c As Range
Dim i As Integer

i = 1

With cell
    .Value = vbNullString
    .ClearFormats

For Each c In source
        .Value = .Value & " " & Trim(c)
        Next c

.Value = Trim(.Value)

For Each c In source
            With .Characters(Start:=i, Length:=Len(Trim(c))).Font
            .Name = c.Font.Name
            .FontStyle = c.Font.FontStyle
            .Size = c.Font.Size
            .Strikethrough = c.Font.Strikethrough
            .Superscript = c.Font.Superscript
            .Subscript = c.Font.Subscript
            .OutlineFont = c.Font.OutlineFont
            .Shadow = c.Font.Shadow
            .Underline = c.Font.Underline
            .ColorIndex = c.Font.ColorIndex
            End With
            .Characters(Start:=i + Len(c), Length:=1).Font.Size = 1
        i = i + Len(Trim(c)) + 1
        Next c

End With

End Sub
Sub test()
Dim rng As Range
Set rng = [A3:C3] 'Not yet looping
Dim row As Range
    For Each row In rng.Rows
    'Debug.Print col.Column
        Call concatenate_cells_formats([D3], rng) 'Not yet looping
    Next row
End Sub

Spam một đoạn code vậy

www.giaiphapexcel.com/diendan/threads/g%C3%A0-excel-mu%E1%BB%91n-h%E1%BB%8Fi-n%E1%BB%91i-chu%E1%BB%97i-v%C3%A0-format-t%E1%BB%ABng-k%C3%BD-t%E1%BB%B1-k%C3%BD-s%E1%BB%91.163755/post-1092367

Code dưới của bạn @bebo021999 đã trả lời ở thớt khác
"Bạn" xem xài được không?!

Sub LoaiBoSo()
Dim i&, j&, cell As Range, k As String, st As String, arr(1 To 10000, 1 To 3)
Application.ScreenUpdating = False
For Each cell In Selection
    st = "": j = 0
    For i = 1 To Len(cell)
        k = Mid(cell, i, 1)
        If Not IsNumeric(k) Then
            j = j + 1
            arr(j, 1) = k: arr(j, 2) = cell.Characters(i, 1).Font.Color
            arr(j, 3) = cell.Characters(i, 1).Font.Bold
        End If
    Next
    For i = 1 To j
        st = st & arr(i, 1)
    Next
    cell.Value = st
    For i = 1 To j
        With cell.Characters(i, 1).Font
            .Color = arr(i, 2)
            .Bold = arr(i, 3)
        End With
    Next
Next
Application.ScreenUpdating = True
End Sub
Ứng dụng AI và Chat GPT trong Quản trị nhân sự
Khóa học SprinGO phù hợp

Ứng dụng AI và Chat GPT trong Quản trị nhân sự

Học xong khóa này, học viên có thể: Hiểu đúng bản chất AI, các nhóm AI phổ biến và cách AI “hoạt động” ở...

Xem khóa học
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    Code dưới của bạn @bebo021999 đã trả lời ở thớt khác
    "Bạn" xem xài được không?!

    Sub LoaiBoSo()
    Dim i&, j&, cell As Range, k As String, st As String, arr(1 To 10000, 1 To 3)
    Application.ScreenUpdating = False
    For Each cell In Selection
        st = "": j = 0
        For i = 1 To Len(cell)
            k = Mid(cell, i, 1)
            If Not IsNumeric(k) Then
                j = j + 1
                arr(j, 1) = k: arr(j, 2) = cell.Characters(i, 1).Font.Color
                arr(j, 3) = cell.Characters(i, 1).Font.Bold
            End If
        Next
        For i = 1 To j
            st = st & arr(i, 1)
        Next
        cell.Value = st
        For i = 1 To j
            With cell.Characters(i, 1).Font
                .Color = arr(i, 2)
                .Bold = arr(i, 3)
            End With
        Next
    Next
    Application.ScreenUpdating = True
    End Sub

    Code này có liên quan đến ghép chuỗi đâu nhỉ?

    Sub concatenate_cells_formats(cell As Range, source As Range)
    'Anon
    
    Dim c As Range
    Dim i As Integer
    
    i = 1
    
    With cell
        .Value = vbNullString
        .ClearFormats
    
    For Each c In source
            .Value = .Value & " " & Trim(c)
            Next c
    
    .Value = Trim(.Value)
    
    For Each c In source
                With .Characters(Start:=i, Length:=Len(Trim(c))).Font
                .Name = c.Font.Name
                .FontStyle = c.Font.FontStyle
                .Size = c.Font.Size
                .Strikethrough = c.Font.Strikethrough
                .Superscript = c.Font.Superscript
                .Subscript = c.Font.Subscript
                .OutlineFont = c.Font.OutlineFont
                .Shadow = c.Font.Shadow
                .Underline = c.Font.Underline
                .ColorIndex = c.Font.ColorIndex
                End With
                .Characters(Start:=i + Len(c), Length:=1).Font.Size = 1
            i = i + Len(Trim(c)) + 1
            Next c
    
    End With
    
    End Sub
    Sub test()
    Dim rng As Range
    Set rng = [A3:C3] 'Not yet looping
    Dim row As Range
        For Each row In rng.Rows
        'Debug.Print col.Column
            Call concatenate_cells_formats([D3], rng) 'Not yet looping
        Next row
    End Sub

    Spam một đoạn code vậy

    Hihi, kết quả ghép 1,2,3 là "1 2 3", với len = 5
    Ý mình là khi ghép 1,2,3 ra con số 123 và format nó
    Mình đã thử nhiều lần nhưng vẫn chưa ra kết quả.
    Mình đoán lý do là:
    1- Khi dùng cells. characters, nếu A,B,C thì sẽ ra đúng "ABC" và format đúng như vậy.
    2- Khi dùng cells. characters, nếu 1,2,3 thì sẽ ra đúng "123" nhưng format lại là format của số đầu tiên là số 1
    3- Khi dùng cells. characters thì nó làm việc hiệu quả với "real characters" không phải với number ???
    4- Mình đã thử insert thêm ký tự để ra "123" với chuỗi rỗng (như kết quả của bạn) và replace, thì kết quả lại về như 2)
    1346

    Theo tôi thì hàm Characters() không dùng được cho dạng số nên nó không tách từng ký tự để định dạng. Bạn đổi 1 cột dạng String xem thử.
    Tôi nghĩ nên đổi qua cách duyệt chuỗi thông thường là đếm từng ký tự chứ không dùng hàm Characters().

    Có thể số 123 được định dạng từng số thì không thể, khi nó là giá trị. Mình đã thử format bằng tay cũng không được
    Nhưng nếu nhập dạng text:
    '123
    và format bằng tay thì được (như file đính kèm ở post 1)
    Tuy nhiên, dùng code để format cái text này thì vẫn không được.
    Mong các cao thủ ghé qua và chỉ giáo.

    @bebo021999

    Bác thử thêm dấu cách không có chiều rộng mã ChrW(8203) vào trước số

    Mình đã thử 1 đoạn code đơn giản:

    Option Explicit
    Sub test()
    Dim i&, j&
    For i = 1 To 2
    For j = 1 To 3
    Cells(i, "D").Value = Cells(i, "D").Value & Cells(i, j)
    Next
    For j = 1 To 3
    Cells(i, "D").Characters(j, 1).Font.Color = Cells(i, j).Font.Color
    Next
    Next

    'Neu thêm doan này vào thì "Puteo"
    'Range("D1").Value = CLng(Range("D1").Value)

    End Sub

    Chạy ngon cho ABC nhưng 123 thì ra 123 dạng text. Nếu cố đổi ra số thì tèo.

    Chốt lại (không biết có đúng không):
    "Một con số dạng value thì không thể format từng phần bên trong."

    1358
    Nhập bằng số – gán kết quả xuống Cell rồi đổi thành Text sẽ format được nhưng khi đổi lại thành Number là trở về 1 loại định dạng. 🙂

    Cho biết Lý do tại sao số lại có chuyện chữ này khác chữ kia?
    Có lý do chính đáng rồi mới tính đến chuyện giải quyết.
    Rất có thể MS nghĩ rằng chuyện lắc léo vậy rất hiếm khi xảy ra cho nên họ giấu cách giải quyết ở đâu đó. Tránh rắc rối choi những người… không thích chuyện rắc rối.
    Nếu biết nhu cầu thì có thể dùng cái nhu cầu ấy để hỏi mấy tay chuyên mò giải pháp.

    Hỏi nhỏ: thành viên gạo cội mà cũng nói chuyên cao nhơn với chỉ giáo như con nít nhỉ? -.,;

    Nhu cầu có chứ bác.
    Cũng có lúc cần format con số hàng ngàn chẳng hạn
    10000
    Với con số 10 lớn hơn và bôi đỏ
    Kiểu như VND mất giá, người ta không quan tâm số lẻ, chỉ muốn xem số hàng ngàn mà thôi

    Vấn đề em quan tâm là: Có cách nào format từng con số bên trong mà thôi.

    Tôi chỉ có thể dịch những nhu cầu theo cách làm của bọn tôi và hỏi những người quen (họ là người nước ngoài). Bọn tôi nhìn bàng giá theo con mắt tài chính, thiết kế khác những người ở đây.
    Những nhu cầu lạ quá, sử dụng theo kiểu VN hóa thì tôi không thể "communicate" với họ. Chịu thua.

    Được bình thường mà.
    1366
    Mình thấy trong chủ để này, câu hỏi ở bài #2 và #3 đáng quan tâm hơn cả.

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm