Cách lấy Văn bản & Số trong Đảo ngược thông qua VBA trong Microsoft Excel
Trong excel, có những lúc chúng ta muốn văn bản bị đảo ngược hoàn toàn hoặc thứ tự của chúng bằng mã VBA. Có thể có nhiều yêu cầu khác nhau, như trích xuất nội dung ô đảo ngược, đảo ngược thứ tự ô, v.v.
Trong bài này chúng ta cùng tìm hiểu các nội dung sau:
-
Làm thế nào để lấy nội dung ô ngược?
-
Làm thế nào để lấy tất cả các từ theo thứ tự ngược lại từ một ô?
-
Làm thế nào để đảo ngược thứ tự cột?
-
Làm thế nào để nhận được số đảo ngược chỉ từ văn bản?
-
Làm thế nào để đảo ngược nội dung ô của activecell?
Làm thế nào để lấy nội dung ô ngược?
Trong Excel có yêu cầu đảo ngược văn bản hoặc số trong ô, ví dụ: “English” thành “hsilgne” Sau đây là ảnh chụp dữ liệu trước khi xuất:
Sau đây là ảnh chụp nhanh yêu cầu đầu ra trong cột B:
Để có kết quả trên, chúng ta cần làm theo các bước sau để khởi chạy trình soạn thảo VB. Nhấp vào tab Developer Từ nhóm Code, chọn Visual Basic
-
Sao chép đoạn mã dưới đây trong mô-đun chuẩn
Function CompleteReverse(rCell As Range, Optional IsText As Boolean) Dim i As Integer Dim StrNewTxt As String Dim strOld As String strOld = Trim(rCell) For i = 1 To Len(strOld) StrNewTxt = Mid(strOld, i, 1) & StrNewTxt Next i If IsText = False Then CompleteReverse = CLng(StrNewTxt) Else CompleteReverse = StrNewTxt End If End Function
===
Trong ô B1, công thức sẽ là = CompleteReverse (A1, TRUE)
Làm thế nào để lấy tất cả các từ theo thứ tự ngược lại từ một ô?
Chúng tôi sẽ có một vài mã để tìm ra giải pháp. Để có được tất cả các từ theo thứ tự ngược hoàn toàn, chúng tôi sẽ sao chép và dán đoạn mã sau vào mô-đun
Function ReverseOrder1(Rng As Range) Dim Val As Variant, Counter As Integer, R() As Variant Val = Split(Application.WorksheetFunction.Substitute(Rng.Value, " ", ""), ",") ReDim R(LBound(Val) To UBound(Val)) For Counter = LBound(Val) To UBound(Val) R(UBound(Val) - Counter) = Val(Counter) Next Counter ReverseOrder1 = Join(R, ", ") End Function
Trong ô C1, công thức sẽ là = ReverseOrder1 (A1)
Hãy xem mã VBA thứ hai:
Function ReverseOrder2(Rng As Range) As String Dim Counter As Long, R() As String, temp As String R = Split(Replace(Rng.Value2, " ", ""), ",") For Counter = LBound(R) To (UBound(R) - 1) \ 2 temp = R(UBound(R) - Counter) R(UBound(R) - Counter) = R(Counter) R(Counter) = temp Next Counter ReverseOrder2 = Join(R, ", ") End Function
Trong ô D1, công thức sẽ là = ReverseOrder2 (A1)
Làm thế nào để đảo ngược thứ tự cột?
Trong trường hợp bạn có yêu cầu đảo ngược thứ tự của dữ liệu cột thì bạn nên xem kỹ đoạn mã dưới đây:
Sub ReverseColumnOrder() Dim wBase As Worksheet, wResult As Worksheet, i As Long, x As Long Set wBase = Sheets("Sheet1") Set wResult = Sheets("Sheet2") Application.ScreenUpdating = False With wBase For i = .Range("A1").CurrentRegion.Rows.Count To 1 Step -1 x = x + 1 .Range("A1").CurrentRegion.Rows(i).Copy wResult.Range("A" & x) Next i End With Application.ScreenUpdating = True End Sub
Đoạn mã trên sẽ kiểm tra dữ liệu ở cột A trong sheet1 và sau đó đảo ngược thứ tự trong sheet 2. Tham khảo hình ảnh dưới đây
===
Làm thế nào để nhận số đảo ngược chỉ từ văn bản?
Ví dụ: “mẹo excel (123)” là nội dung ô Yêu cầu đầu ra: “mẹo excel (321)”
Trong excel, có thể có nhiều cách để có được kết quả giống nhau và tìm giải pháp với VBA UDF’s cũng vậy. Đối với ví dụ này, chúng tôi sẽ chỉ ra 5 cách khác nhau.
Sao chép và dán các mã sau vào mô-đun chuẩn:
Function ReverseNumber1(v As Variant) As String Dim iSt As Integer, iEnd As Integer, sNum As String, sTemp As String iSt = InStr(v, "(") iEnd = InStr(v, ")") If iSt = 0 Or iEnd = 0 Then ReverseNumber1 = v: Exit Function sNum = Mid(v, iSt + 1, iEnd - iSt - 1) For i = Len(sNum) To 1 Step -1 sTemp = sTemp & Mid(sNum, i, 1) Next i ReverseNumber1 = Left(v, iSt) & sTemp & Mid(v, iEnd, 5 ^ 5) End Function Function ReverseNumber2(s As String) As String Dim i&, t$, ln& t = s: ln = InStr(s, ")") - 1 For i = InStr(s, "(") + 1 To InStr(s, ")") - 1 Mid(t, i, 1) = Mid(s, ln, 1) ln = ln - 1 Next ReverseNumber2 = t End Function Function ReverseNumber3(c00) c01 = Split(Split(c00, ")")(0), "(")(1) ReverseNumber3 = Replace(c00, "(" & c01 & ")", "(" & StrReverse(c01) & ")") End Function Function ReverseNumber4(c00) ReverseNumber4 = Left(c00, InStr(c00, "(")) & StrReverse(Mid(Left(c00, _ InStr(c00, ")") - 1), InStr(c00, "(") + 1)) & Mid(c00, InStr(c00, ")")) End Function Function ReverseNumber5(s As String) Dim m As Object With CreateObject("VBScript.Regexp") .Global = True .Pattern = "(\D)(\d)" For Each m In .Execute(s) ReverseNumber5 = ReverseNumber5 & m.submatches(0) & StrReverse(m.submatches(1)) Next End With Set m = Nothing End Function
Trong ô B2, công thức sẽ là = ReverseNumber1 (A2)
Chúng ta có thể kiểm tra 4 mã còn lại bằng công thức sau:
{trống} 1. = ReverseNumber2 (A2)
{trống} 2. = ReverseNumber3 (A2)
{trống} 3. = ReverseNumber4 (A2)
{trống} 4. = ReverseNumber5 (A2)
Tất cả 5 mã macro trên sẽ cung cấp cùng một đầu ra; Tuy nhiên; người ta có thể áp dụng mã mà họ cảm thấy thoải mái nhất.
Làm thế nào để đảo ngược nội dung ô của activecell?
Trong trường hợp bạn muốn macro chỉ chạy trên activecell & sau đó đảo ngược nội dung. Mã này sẽ không chạy trên ô có chứa công thức.
Chúng tôi sẽ sử dụng đoạn mã sau:
Sub Reverse_Cell_Contents() 'this macro will run only on activecell' --- Comment If Not ActiveCell.HasFormula Then sRaw = ActiveCell.Text sNew = "" For j = 1 To Len(sRaw) sNew = Mid(sRaw, j, 1) + sNew Next j ActiveCell.Value = sNew End If End Sub
Nếu con trỏ nằm trên ô A1, có chứa “exceltip”, thì macro ở trên sẽ chuyển nó thành “pitlecxe”.
Kết luận: Chúng ta có thể có bao nhiêu UDF cho một giải pháp duy nhất trong Microsoft Excel. UDF này sẽ hoạt động từ phiên bản 2003 đến 2013.
Nếu bạn thích blog của chúng tôi, hãy chia sẻ nó với bạn bè của bạn trên Facebook. Và bạn cũng có thể theo dõi chúng tôi trên Twitter và Facebook.
Chúng tôi rất muốn nghe ý kiến của bạn, hãy cho chúng tôi biết cách chúng tôi có thể cải thiện, bổ sung hoặc đổi mới công việc của mình và làm cho nó tốt hơn cho bạn. Viết thư cho chúng tôi theo địa chỉ [email protected]