Tôi không hiểu bạn khoe cái "không dùng vòng lặp" để làm gì nhỉ? Một đằng là tự viết, một đằng là dùng "đồ" của người khác.
Thế nếu bạn hungpecc1 sửa lại chút code rồi viết thành DLL nào đó rồi sau đó tôi dùng SUB của bạn ấy thì sao? Chả nhẽ tôi sẽ nói: "không dùng vòng lặp"? Thậm chí tôi còn hét lên: Thậm chí không cần "chỉ cần duyệt các số qua thêm 1 vòng lặp nữa thôi thì công việc đã hoàn tất rồi" mà có luôn "công việc đã hoàn tất"?
Nếu công việc bắt buộc phải "đóng đinh" thì phải đóng đinh, thế thôi. Bạn không phải đóng đinh chẳng qua là bạn "mượn" ai đó đóng định hộ bạn mà thôi. Cũng có thể bạn và không ai đóng định nhưng lúc đó thì để làm công việc bạn phải "vặn vít". Bạn không vặn thì có nghĩa là bạn "mượn" ai đó vặn. Mà bạn đừng khoe là không phải đóng đinh nhé. Vì lúc đó tôi sẽ khoe là tôi không phải vặn vít như bạn.
Công việc không tự nhiên sinh ra và cũng không tự nhiên mất đi. Nó chỉ "nhẩy" từ người này sang người khác. Bạn học định luật bảo toàn công việc chưa? He he.
Đã nói không dùng vòng lặp trong VBA rồi mà Thầy, thử xem, nếu dùng hàm InStr để tìm 1 hoặc nhiều ký tự nào đó trong một chuỗi, thì bản thân nó có dùng vòng lặp không? Ai đảm bảo rằng nó sẽ không có đằng sau "hậu trường"? Tuy nhiên, khi người sử dụng nó, có quyền nói rằng "tôi không dùng vòng lặp" trong code của tôi. Vậy thôi à.
Đã nói không dùng vòng lặp trong VBA rồi mà Thầy, thử xem, nếu dùng hàm InStr để tìm 1 hoặc nhiều ký tự nào đó trong một chuỗi, thì bản thân nó có dùng vòng lặp không? Ai đảm bảo rằng nó sẽ không có đằng sau "hậu trường"? Tuy nhiên, khi người sử dụng nó, có quyền nói rằng "tôi không dùng vòng lặp" trong code của tôi. Vậy thôi à.
Oh, thật ra em không nhấn mạnh điều này, bởi vì mỗi người có mỗi thuật toán để thực hiện, những người làm đúng yêu cầu thì đã là có đáp án đúng. Điều em mong đợi rằng qua nhiều đáp án, sẽ có nhiều cách để thực hiện yêu cầu đó, thông qua đó, em sẽ được học thêm nhiều.
Kinh nghiệm cho em thấy rằng "Hãy cho rồi sẽ nhận", nên em sẳn sàng gửi tặng những gì em học được và hiểu biết được lên diễn đàn, và sau đó em biết em sẽ được nhiều người góp ý, chỉnh sửa và hoàn thiện ý tưởng của em.
Làm đại 2 cách cách nào được thì lấy .
Phương án 1
PHP:
Function Function1(Str As String) As String
Dim Arr, i As Long, j As Long, Tmp, Count As Long
Arr = Split(Str, ", ")
For i = LBound(Arr) To UBound(Arr)
For j = i + 1 To UBound(Arr)
If CLng(Arr(j)) < CLng(Arr(i)) Then
Tmp = Arr(j): Arr(j) = Arr(i): Arr(i) = Tmp
End If
Next
Next
Tmp = Arr(LBound(Arr)): Count = 1: Str = ""
For i = LBound(Arr) + 1 To UBound(Arr)
If CLng(Arr(i)) = Tmp + Count Then
Count = Count + 1
Else
Str = Str & ", " & Tmp & IIf(Count > 1, "-" & (Tmp + Count - 1), "")
Tmp = CLng(Arr(i))
Count = 1
End If
Next
Str = Str & ", " & Tmp & IIf(Count > 1, "-" & (Tmp + Count - 1), "")
Function1 = Replace(Str, ", ", "", 1, 1)
End Function
Thế nếu bạn hungpecc1 sửa lại chút code rồi viết thành DLL nào đó rồi sau đó tôi dùng SUB của bạn ấy thì sao? Chả nhẽ tôi sẽ nói: "không dùng vòng lặp"? Thậm chí tôi còn hét lên: Thậm chí không cần "chỉ cần duyệt các số qua thêm 1 vòng lặp nữa thôi thì công việc đã hoàn tất rồi" mà có luôn "công việc đã hoàn tất"?
Nếu công việc bắt buộc phải "đóng đinh" thì phải đóng đinh, thế thôi. Bạn không phải đóng đinh chẳng qua là bạn "mượn" ai đó đóng định hộ bạn mà thôi. Cũng có thể bạn và không ai đóng định nhưng lúc đó thì để làm công việc bạn phải "vặn vít". Bạn không vặn thì có nghĩa là bạn "mượn" ai đó vặn. Mà bạn đừng khoe là không phải đóng đinh nhé. Vì lúc đó tôi sẽ khoe là tôi không phải vặn vít như bạn.
Công việc không tự nhiên sinh ra và cũng không tự nhiên mất đi. Nó chỉ "nhẩy" từ người này sang người khác. Bạn học định luật bảo toàn công việc chưa? He he.
Đây là sai lầm ngớ ngẩn nhất của nhiều người sử dụng - cứ tưởng đó không phải dùng vòng lặp (khi sử dụng công cụ khác) - ví như dùng máy xay sinh tốt thay vì dùng dao cắt rùi nghền ... sẽ nghĩ nó không cắt không chém ( có khi còn cắt chém nhiều hơn nhiều năng lượng hơn). Vì thế không thể nói là không dùng vòng lặp dù là Instr hay là scripts nào đó
Vì thế, đôi khi ta cần rèn luyện từ bước cơ bản, và hiểu bản chất của các công cụ chứ không phải nói sai từ như thế dẫn đến nhiều người hiểu lầm
2) Gán mảng đó vào sheet sau khi đổi chiều (Transpose)
3) Dùng công cụ SORT của sheet sắp xếp lại dữ liệu
4) Gán ngược giá trị về mảng rồi chuyển mảng về chuỗi.
Mã:
Sub NoiChuoi()
Dim Chuoi As String, Str As String
Dim SplArr, StrSplArr(), i As Long, u As Long
Chuoi = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
SplArr = Split(Chuoi, ",")
u = UBound(SplArr) + 1
With Range("F1").Resize(u)
.Value = WorksheetFunction.Transpose(SplArr)
.Sort [F1], xlAscending
SplArr = .Value
End With
For i = 2 To u
Str = Str & "," & SplArr(i, 1)
Next
Str = SplArr(1, 1) & Str
Debug.Print Str
[COLOR=#008000]' ReDim StrSplArr(1 To u)[/COLOR]
[COLOR=#008000]' For i = 1 To u[/COLOR]
[COLOR=#008000]' StrSplArr(i) = SplArr(i, 1)[/COLOR]
[COLOR=#008000]' Next[/COLOR]
[COLOR=#008000]' Chuoi = Join(StrSplArr, ",")[/COLOR]
[COLOR=#008000]' Debug.Print Chuoi[/COLOR]
End Sub
Nhưng chúng ta phải làm như vậy sao? Nếu mà là hàm thì Sheet ở đâu ra nhỉ? Tạo ra? Lỡ phần tử bên trong lớn hơn số hàng thì sao?
Theo em nếu đã đưa được chuỗi về mảng Arr= Split(str,",") ta có thể dùng các thuật toán sắp xếp mảng thông dụng :
* Cách sắp xếp như của a Huuthang_bd hình như được gọi là Selection Sort
* Theo kiểu Quick Sort thì như vậy :
[GPECODE=vb]
Sub quicksort(subArr(), ByVal L As Long, ByVal U As Long)
Dim i As Long, j As Long
Dim pivot, TG
If L >= U Then Exit Sub
i = L: j = U
pivot = Int(Rnd() * (j - i + 1) + i)
Do
While subArr(i) < subArr(pivot)
i = i + 1
Wend
While subArr(j) > subArr(pivot)
j = j - 1
Wend
If i <= j Then
TG = subArr(i): subArr(i) = subArr(j): subArr(j) = TG
i = i + 1
j = j - 1
End If
Loop Until i > j
quicksort subArr, L, j
quicksort subArr, i, U
End Sub
[/GPECODE]
Kiểm tra :
Mã:
Sub test()
Dim arr()
Dim item
arr = Array(1, 3, 5, 8, 97, 4, 5, 6)
quicksort arr, LBound(arr), UBound(arr)
For Each item In arr
Debug.Print item
Next
End Sub
* Hôm qua mới vọc thêm vụ Distribution count sorting :sắp xếp bằng phép đếm phân phối : Cách thức hoạt động của thuật toán - Ta xây dựng dãy c(1),c(2),...,c(M) trong đó c(i) là số lần xuất hiện của số i trong dãy cần sắp xếp. Vd: Với dãy: 1,5,4,2,1,4,7,5,5,8 thì: c(1)=2; c(2)=1,c(4)=2; c(5)=3; c(7)=1; c(8)=1 - Dựa vào c(i), ta có thể biết được giá trị i sẽ nằm từ vị trí nào đến vị trí nào trong dãy đã sắp xếp: Vd: Với dãy trên sau khi đã sắp xếp là: 1,1,2,4,4,5,5,5,7,8 ++++++++++Giá trị 1 đứng ở vị trí từ 1 -> c(1) [tức từ 1 -> 2] ++++++++++Giá trị 2 đứng ở vị trí từ c(1)+1 -> c(1) + c(2) [tức là từ 3->3] ++++++++++Giá trị i đứng ở vị trí từ c(1)+c(2)+c(3)+...+c(i-1)+1 -> c(1)+c(2)+c(3)+...+c(i-1)+c(i) - Sau đó dựa vào dãy c này ta dựng nên dãy t là dãy đã được sắp xếp từ dãy a và gán dãy t vào dãy a.
Mã:
[COLOR=#000080][FONT=monospace]Private[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Sub[/FONT][/COLOR][COLOR=#444444][FONT=monospace] DistributionCountingSort()[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]Dim[/FONT][/COLOR][COLOR=#444444][FONT=monospace] c(1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] M) [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]Dim[/FONT][/COLOR][COLOR=#444444][FONT=monospace] t(1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] N) [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]Dim[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR][COLOR=#444444][FONT=monospace], j [/FONT][/COLOR][COLOR=#000080][FONT=monospace]As[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Long[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = 1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] N[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace] c(a(i)) = c(a(i)) + 1 [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Đếm số lần xuất hiện của giá trị i trong dãy
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = 2 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] M[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace] c(i) = c(i - 1) + c(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Tính vị trí cuối của mỗi giá trị trong dãy
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = N [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] 1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]Step[/FONT][/COLOR][COLOR=#444444][FONT=monospace] -1[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace] j = a(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Lấy ra giá trị của khóa a(i)
[/FONT][/COLOR][COLOR=#444444][FONT=monospace] t(c(j)) = a(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'biến c(j) sẽ chứa vị trí mà a(i) cần phải ở khi đã được sắp xếp, giá trị này sẽ được đưa vào đúng vị trí trong dãy t
[/FONT][/COLOR][COLOR=#444444][FONT=monospace] c(j) = c(j) - 1 [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'đồng thời giảm giá trị của c(j) xuống 1 đơn vị để những giá trị sau sẽ được thêm vào trước vị trí trên.
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]For[/FONT][/COLOR][COLOR=#444444][FONT=monospace] i = 1 [/FONT][/COLOR][COLOR=#000080][FONT=monospace]To[/FONT][/COLOR][COLOR=#444444][FONT=monospace] N[/FONT][/COLOR]
[COLOR=#444444][FONT=monospace] a(i) = t(i) [/FONT][/COLOR][COLOR=#008000][FONT=monospace]'Gán toàn bộ giá trị của dãy t vào dãy a
[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Next[/FONT][/COLOR]
[COLOR=#000080][FONT=monospace]End[/FONT][/COLOR][COLOR=#000080][FONT=monospace]Sub[/FONT][/COLOR]
p/s : mà hình như chủ đề là " đố vui VBA " còn mấy cái vụ này không được gọi là "đố vui" roài , anh có thể rời bài ra topic " vui để đố " để không vi phạm nội quy
Theo em nếu đã đưa được chuỗi về mảng Arr= Split(str,",") ta có thể dùng các thuật toán sắp xếp mảng thông dụng :
* Cách sắp xếp như của a Huuthang_bd hình như được gọi là Selection Sort
* Theo kiểu Quick Sort thì như vậy
.....................
Một mảng được cắt ra từ chuổi thì nó có được bao nhiêu phần tử mà phải "đấu" về tốc độ
Có thể dùng System.Collections.ArrayList cho đơn giản.
Thí nghiệm xem:
Mã:
Sub Test()
Dim str As String, arr, i As Long
str = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
arr = Split(str, ",")
With CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
.Sort: arr = .ToArray
End With
MsgBox Join(arr, "-")
End Sub
p/s : mà hình như chủ đề là " đố vui VBA " còn mấy cái vụ này không được gọi là "đố vui" roài , anh có thể rời bài ra topic " vui để đố " để không vi phạm nội quy
Bạn hãy đưa dữ liệu đầu vào về dạng chuẩn dữ liệu ở bài đầu tiên bạn đố (tức là giữa các số được phân cách nhau bằng một dấu phẩy và một khoản trắng) thì bạn sẽ thấy.
Sub Test()
Dim str As String, arr, i As Long
str = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
arr = Split(str, ",")
With CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
.Sort: arr = .ToArray
End With
MsgBox Join(arr, "-")
End Sub
Function SortArraySystem2(SerStr As String) As String
Dim str As String, arr, i As Long
arr = Split(SerStr, ",")
With CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(arr)
.Add CLng(arr(i))
Next
.Sort
[COLOR=#ff0000][B] .Reverse[/B][/COLOR]
arr = .ToArray
End With
SortArraySystem2 = Join(arr, "-")
End Function
Một mảng được cắt ra từ chuổi thì nó có được bao nhiêu phần tử mà phải "đấu" về tốc độ
Có thể dùng System.Collections.ArrayList cho đơn giản.
Thí nghiệm xem:
Mã:
Sub Test()
Dim str As String, arr, i As Long
str = "10,9,8,5,6,7,8,3,4,6,7,9,10,1,11,33"
arr = Split(str, ",")
With CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(arr): .Add CLng(arr(i)): Next
.Sort: arr = .ToArray
End With
MsgBox Join(arr, "-")
End Sub
------------------------------
ĐỐ VUI tức là ĐỐ cái gì thật ĐƠN GIẢN nhưng ít ai nghĩ ra (đáp án bất ngờ)
Vậy nên bài này chẳng VUI tí nào
Function SortArrayScript(SerStr As String) As String
SerStr = "('" & SerStr & "').split(',').sort(function(a,b){return (a-b)}).join(',')" ' & ".reverse()" 'if DESC
With CreateObject("MSScriptControl.ScriptControl")
.Language = "JavaScript"
SortArrayScript = .Eval(SerStr)
End With
End Function
Function SortArraySystem(SerStr As String) As String
Dim str As String, arr, i As Long
arr = Split(SerStr, ",")
With CreateObject("System.Collections.ArrayList")
For i = 0 To UBound(arr)
.Add CLng(arr(i))
Next
.Sort: arr = .ToArray
End With
SortArraySystem = Join(arr, "-")
End Function
Xét về tốc độ, thì 2 thằng em này cũng ngang ngang nhau, nếu dùng For ... Next do mình xử lý chuỗi thì có mà chờ dài cổ, tôi đã thử code của huuthang_bd với 1,000 mục cho ra thời gian đâu có bao nhiêu: 114 giây! Trong khi đó, với 60,000 mục thì 2 thằng em trên xử lý trong vòng 2 giây.
Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!
''===================================
Suy cho cùng thì tôi thích cách mà Thầy NDU giới thiệu hơn: System.Collections.ArrayList
Nó dễ hiểu, dễ hình dung, nó đơn giản và không cầu kỳ, không như MSScriptControl.ScriptControl cấu trúc thật sự khó hiểu và không thân thiện lắm.
Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!
Function Sort1DArray(ByVal SourceArray, ByVal Order As Boolean)
Dim i As Long, aTmp
On Error Resume Next
aTmp = SourceArray
With CreateObject("System.Collections.ArrayList")
For i = LBound(aTmp) To UBound(aTmp): .Add aTmp(i): Next
.Sort
If Order = False Then .Reverse
Sort1DArray = .ToArray()
End With
End Function
Function Sort1DArray(ByVal SourceArray, ByVal Order As Boolean)
Dim i As Long, aTmp
On Error Resume Next
aTmp = SourceArray
With CreateObject("System.Collections.ArrayList")
For i = LBound(aTmp) To UBound(aTmp): .Add aTmp(i): Next
.Sort
If Order = False Then .Reverse
Sort1DArray = .ToArray()
End With
End Function
Sẳn đây em cũng có tham khảo một số thủ tục mà CreateObject("System.Collections.ArrayList") hoạt động, những bạn chưa biết nhiều về nó thì tham khảo chung luôn:
[GPECODE=vb] Option Explicit
Sub ptest()
'http://www.robvanderwoude.com/vbstech.php#Data
'http://www.thecodecage.com/forumz/showthread.php?p=1055000938#post1055000938
'this code creates and populates an ArrayList
Dim myArrayList As Object, myArrayList2 As Object
Dim xItem, myrange
'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))
' copy / clone ArrayList
Set myArrayList2 = myArrayList.Clone
'Now, to add an element and sort the ArrayList, all we need to do is:
'add the new element to the ArrayList
myArrayList.Add "Z"
'remove the new element to the ArrayList
myArrayList.Remove "C"
'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))
'result to immediate window
Debug.Print "List Has C " & myArrayList.Contains("C")
Debug.Print "List Has Z " & myArrayList.Contains("Z")
'result to immediate window - count elements and capacity
Debug.Print "Size : " & myArrayList.Count
Debug.Print "Capacity : " & myArrayList.Capacity
'trim blank elements from the ArrayList
myArrayList.TrimToSize
'result to immediate window - count elements and capacity
Debug.Print "Size : " & myArrayList.Count
Debug.Print "Capacity : " & myArrayList.Capacity
'sort the ArrayList
myArrayList.Sort
'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))
' reverse the ArrayList
myArrayList.Reverse
'result to immediate window
Debug.Print Join(myArrayList.toarray(), Chr(10))
' copy / clone ArrayList2 result to immediate window
Debug.Print Join(myArrayList2.toarray(), Chr(10))
'toarray transfer ArrayList to results to worksheet
Range("B1").Resize(myArrayList.Count) = Application.Transpose(myArrayList.toarray())
Range("C1").Resize(1, myArrayList.Count) = myArrayList.toarray()
Set myArrayList = Nothing
Set myArrayList2 = Nothing
End Sub[/GPECODE]
Debug.Print "Size : " & objSortedList.Count
Debug.Print "Capacity : " & objSortedList.Capacity
'This will result in the following output:
'Size : 4
'Capacity : 16
'Size : 4
'Capacity : 4
'Cloning a SortedList is a piece of cake:
Dim xxxx
Set objList2 = objSortedList.Clone
Debug.Print "Sorted List Key(1) = " & objSortedList.GetKey(1)
Debug.Print "Cloned List Key(1) = " & objList2.GetKey(1)
'The result:
'Sorted List Key(1) = Fourth
'Cloned List Key(1) = Fourth
Set objList2 = Nothing
Set objSortedList = Nothing
End Sub [/GPECODE]
[GPECODE=vb]Option Explicit Sub System_Collections_ArrayList()
' Reference Library mscorlib
Dim ArrayListOne As Object, ArrayListTwo As ArrayList, ArrayListThree As Object, ArrayListFour As ArrayList
Set ArrayListOne = CreateObject("System.Collections.ArrayList") ' method with out Reference library
Set ArrayListTwo = New ArrayList 'Can use this method after loading Reference Library mscorlib
Set ArrayListThree = CreateObject("System.Collections.ArrayList") ' method with out Reference library
Set ArrayListFour = New ArrayList 'Can use this method after loading Reference Library mscorlib
Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!
Thế cho nên đừng ai vỗ ngực xưng tên tôi hay và chê người ta ngớ ngẫn, mà hãy học thêm và biết chọn lọc tinh hoa của người khác mà ứng dụng vô công việc của mình. Bạn có giỏi thì cứ cắt bằng tay đi rồi nghiền nát, còn tôi thì dùng máy xay sinh tố vậy!
......
Tôi đã nói ở bài #813 là nói về nhận định của bác siwtom, bạn đừng có chen ngang vào nhé
Nhưng bạn đã cố tình viết, thì tôi trả lời:
Không đúng Hoàng Trọng Nghĩa ơi,
Khi chọn một công cụ có sẵn được ví như ta chọn máy sinh tố để xay hoa quả: Không ai bảo chọn máy sinh tố là ngớ ngẩn cả, mà cái khái niệm nghĩ máy sinh tố không có phải cắt chém (lặp đi lặp lại việc cắt chém) thì là sai lầm ngớ ngẩn (ngớ ngẫn ở đây là đãng trí là lơ đãng là có thể chưa hiểu cơ bản, hay có thể dù không biết các công cụ có dùng vòng lặp hay không mà cứ khẳng định như đúng rùi là không có vòng lặp - vì đã đem ra đố thì tự mình phải có giải đáp, đáp án rui - không thể đánh lận còn đen muốn biết không hỏi mà lại ra vẻ đi đố được - chắc bạn không rơi vào trường hợp này)
Còn xưa nay ta vẫn có thể nói là nếu vấn đề nào sử dụng được các công cụ của sẵn trong excel, từ DLL tốt (như các DLL đã được Microsoft cung cấp) thì chắc chắn NHANH HƠN nhiều so với nếu chúng ta dùng cách thông thường viết (vì code VBA là code thuộc hạng chưa dịch - chạy ở tầng thứ cấp) - như việc không bao giờ người ta lại so sánh giữa cái có sẵn (máy xay sinh tố) đó với việc dùng từng bước (dùng dao tự cắt) rõ chưa - việc so sánh đó mới là ngớ ngẩn
Tuy thế, tùy từng quy mô công việc mà chúng ta sử dụng hay KHÔNG sử dụng công cụ có sẵn hay không? sao cho hợp lý ví như có mỗi một quả cherry nhỏ mà ném vào máy xay sinh tố thì thật là không đáng,
Túm lại, việc tôi nói "khái niệm về ngớ ngẩn" là ở chỗ đó chứ không phải giật mình đâu bạn ah,
Về việc đố vui ở đây, thì nhiều người nói rùi đó (cũng là lý do mà bài trên tôi chỉ trả lời và giải thích rõ bài #812 của bác siwtom):
...........
p/s : mà hình như chủ đề là " đố vui VBA " còn mấy cái vụ này không được gọi là "đố vui" roài , anh có thể rời bài ra topic " vui để đố " để không vi phạm nội quy
Bạn còn là MOD (mới nhìn lại màu mới thấy) nữa - càng phải cần tự xét lại mình xem bài viết cách hỏi, cách viết như thế đúng là hợp lý chưa nhé... xin cảm ơn
Ngớ ngẩn gì đâu chứ trong khi ta thấy nó KHÔNG VÒNG LẬP thì ta nói nó không lập thôi (bên trong ruốt nó lập hay không thây kệ nó)
Vấn đề là: Nếu ta tự viết được cái của riêng ta nó NHANH hơn thì ta xài, không thì cứ xài cái mà ta nghĩ là KHÔNG LẬP kia cho khỏe
Có gì đâu mà NGỚ với NGẨN nhỉ?
Cũng giống như dùng VBScript.RegEx, ta thấy nó không vòng lập và gọn thì ta xài ---> Ai rảnh đâu mà suy nghĩ bên trong ruột nó viết thế nào. Mà dù có cố suy nghĩ thì ta chắc gì đã biết bên trong nó có LẬP HAY KHÔNG LẬP mà bảo là NÓI SAI TỪ
----------------
Ngộ thiệt (tại ku Nghĩa bực mình thôi chứ em thì chẳng quan tâm)
Ẹc... Ẹc...