Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 17

Chủ đề: Giúp dùm , anh em có hàm nào đảo thứ tự 1 con số.

  1. #1
    nhatlinhit88 Guest

    Giúp dùm , anh em có hàm nào đảo thứ tự 1 con số.


  2. #2
    kysybongdemictu Guest
    Trích dẫn Gửi bởi cuongcarton
    Như tiêu đề trong excel. Mình muốn khi điền 1 số gồm 3 hay 4 chữ số.
    VD:321 ,331 hoặc 1234
    thì cột kế sẽ đảo và cho ra số:
    321= 123,132,213,231,312,321
    332= 332,233,323
    anh em nào biết hàm nào có thể giúp mình dc ko? mình ở TPHCM, nếu dc cà phê giao lưu
    thank
    có file đính kèm mong ae chỉ giáo. Văn chương hơi kém có gì khó hiểu mong ae thông cảm
    Tham khảo ở bài này của tác giả ndu....nhé! Vận dụng sao cho phù hợp với bài của bạn là Ok.
    http://www.giaiphapexcel.com/forum/s...A3y-s%E1%BB%91

  3. #3
    thuongbodo Guest
    Nếu là Sub thì không khó: chọn tất cả các hoán vị, loại bỏ trùng rồi ghi ra sheet. Nhưng nếu là Function thì khó đấy, có khi VBA đơn thuần không làm được (trừ khi dùng thủ đoạn bằng cách thêm thủ tục sự kiện).

  4. #4
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Hau151978
    Nếu là Sub thì không khó: chọn tất cả các hoán vị, loại bỏ trùng rồi ghi ra sheet. Nhưng nếu là Function thì khó đấy, có khi VBA đơn thuần không làm được (trừ khi dùng thủ đoạn bằng cách thêm thủ tục sự kiện worksheet_change để điền vào các ô còn lại).
    Ý tưởng của em cũng giống anh, áp dụng code của thầy ndu và kết hợp với sự kiện change.
    p/s: Nhập số cần đảo vào ô A4 nhấn phím Enter

  5. #5
    sownlee Guest
    Trích dẫn Gửi bởi cuongcarton
    Như tiêu đề trong excel. Mình muốn khi điền 1 số gồm 3 hay 4 chữ số.
    VD:321 ,331 hoặc 1234
    thì cột kế sẽ đảo và cho ra số:
    321= 123,132,213,231,312,321
    332= 332,233,323
    anh em nào biết hàm nào có thể giúp mình dc ko? mình ở TPHCM, nếu dc cà phê giao lưu
    thank
    có file đính kèm mong ae chỉ giáo. Văn chương hơi kém có gì khó hiểu mong ae thông cảm
    Mã:
    Sub GetPermu(x As String, y As String, ByRef n As Long, arr)
      Dim i As Long, j As Long
      j = Len(y)
      If j < 2 Then
        arr(n, 1) = x & y
        n = n + 1
      Else
        For i = 1 To j
         Call GetPermu(x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i), n, arr)
        Next
      End If
    End Sub
    
    
    Sub Daochuoi(Rng As Range, RngD As Range)
    Dim n As Long, arr(1 To 362880, 1 To 1)
      Dim Num As String
      Num = Rng.Value
      n = 1
      Call GetPermu("", Num, n, arr)
         RngD.Resize(n - 1) = arr
    End Sub
    Mượn code của Ndu có chỉnh sửa lại 1 tí và làm theo file của bạn, những thuật toán như vậy muốn học thì nên tìm sách chuyên tin của lớp 10 và 11 học, nó có đầy các dạng phương pháp sinh, tôi lười biếng nên không muốn đọc và viết lại, nên mượn code của anh ndu giúp bạn, bạn đừng hỏi tôi giải thích nha

  6. #6
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi chuot0106
    Ý tưởng của em cũng giống anh, áp dụng code của thầy ndu và kết hợp với sự kiện change.
    p/s: Nhập số cần đảo vào ô A4 nhấn phím Enter
    Đây là SUB chứ không phải UDF. Mình thử 1 UDF kèm theo Worksheet_Change dò xem trong Target có công thức không nhưng thủ tục sự kiện không được kích hoạt.

  7. #7
    seominhthanhvip Guest
    Mã nguồn PHP:
    'Hiểu sai đề, xin các MOD/SMOD xóa dùm!'  

  8. #8
    Ngày tham gia
    Feb 2014
    Bài viết
    0
    Trích dẫn Gửi bởi ChanhTQ@
    Góp vui 1 hàm tự tạo đảo số nguyên


    <div class="bbcode_container">
    <div class="bbcode_description">PHP Code:
    </div>
    </div>
    </div>
    Hình như người ta muốn HOÁN VỊ chứ hổng phải đảo chuỗi sư phụ à
    Với lại, nếu là đảo chuỗi thì em nghĩ chỉ cần vầy là được: DaoSo = StrReverse(Num)

  9. #9
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Hau151978
    Nếu là Sub thì không khó: chọn tất cả các hoán vị, loại bỏ trùng rồi ghi ra sheet. Nhưng nếu là Function thì khó đấy, có khi VBA đơn thuần không làm được (trừ khi dùng thủ đoạn bằng cách thêm thủ tục sự kiện).
    Được chứ sao không!
    Code thế này:

    Mã:
    Function UniquePermuMain(ByVal x As String, ByVal y As String, byRef dic As Object)
      Dim i As Long, j As Long, tmp As String, Ret
      If dic Is Nothing Then Set dic = CreateObject("Scripting.Dictionary")
      j = Len(y)
      tmp = x & y
      If j < 2 Then
        If Not dic.Exists(tmp) Then dic.Add tmp, ""
      Else
        For i = 1 To j
          Ret = UniquePermuMain(x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i), dic)
        Next
      End If
      UniquePermuMain = dic.Keys
    End Function
    Function UniquePermu(ByVal text As String)
      Dim dic As Object, x As String
      UniquePermu = UniquePermuMain(x, text, dic)
    End Function
    Trên bảng tính, tại cell C4, gõ công thức:

    Mã:
    =IFERROR(INDEX(UniquePermu($A$4),,ROWS($1:1)),"")
    kéo fill xuống
    Lưu ý thêm rằng yêu cầu của người ta là hoán vị là lấy giá trị không trùng nên code bài 5 và 6 là không chính xác (thử chuỗi 112, 1122... sẽ biết)
    -----------------
    Tuy nhiên viết thành Function rồi gõ trên bảng tính có thể làm file "nặng" lên nếu như chuỗi đầu vào có độ dài lớn

  10. #10
    [QUOTE="ndu96081631"]Được chứ sao không!
    Trên bảng tính, tại cell C4, gõ công thức:

    Mã:
    Trong module
    Public a
    Function Test(ByVal n)
        Test = n + 1
        a = Application.Caller.Address
    End Function
    Trong sheet
    Private Sub Worksheet_Calculate()
        If a = "" Then Exit Sub
        Range(a).Offset(1, 0) = Range(a) + 1
        a = ""
    End Sub

Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •