Khắc phục Lỗi Overflow ?

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị ^^
Hiện tại thì em đang gặp một số vấn đề sau mong các anh chị khắc phục lỗi giúp em .
Ý tưởng của em là random 50 số rồi in vào 50 dòng xong sắp xếp các số đó theo chiều tăng và giảm.
Nhưng khi làm xong thì giờ em lại muốn random 1 triệu số trong khoảng từ 1 đến 1 triệu xong sắp xếp theo chiều tăng dần nhưng mà nó cứ báo overflow (Chắc nó quá tải gì đó ^^)
Mong các anh chị giúp em cải thiện code của em ở trong file để nó thích hợp với mục đích của em với ạ
1653852510814.png
 

File đính kèm

  • vankip.xlsm
    536.4 KB · Đọc: 6
Mã:
Sub Rnd_2()
    Dim i As Integer
    Dim randomValue As Single
    Range("D1") = "Original numbers2"
    i = 2
    Do While i < 1000000
        randomValue = RndSpecial(1, 1000)
        Range("D" & i) = randomValue
        i = i + 1
    Loop
End Sub

Ở thời điểm chào buổi sáng thì i = 2. Sau đó trong vòng lặp nó được tăng lên dần: 2, 3, ...
Nhưng i được khai báo là INTEGER nên nó chỉ được phép lấy các giá trị trong khoảng từ -32768 tới 32767 - kiểu INTEGER chỉ khiêm tốn thế thôi. Vậy trong vòng lặp sẽ có lúc i = 32767 và lúc đó i = i + 1 sẽ gây ra Overflow. Để có thể nhập vào i giá trị lớn hơn thì phải khai báo i AS LONG
 
Upvote 0
Mã:
Sub Rnd_2()
    Dim i As Integer
    Dim randomValue As Single
    Range("D1") = "Original numbers2"
    i = 2
    Do While i < 1000000
        randomValue = RndSpecial(1, 1000)
        Range("D" & i) = randomValue
        i = i + 1
    Loop
End Sub

Ở thời điểm chào buổi sáng thì i = 2. Sau đó trong vòng lặp nó được tăng lên dần: 2, 3, ...
Nhưng i được khai báo là INTEGER nên nó chỉ được phép lấy các giá trị trong khoảng từ -32768 tới 32767 - kiểu INTEGER chỉ khiêm tốn thế thôi. Vậy trong vòng lặp sẽ có lúc i = 32767 và lúc đó i = i + 1 sẽ gây ra Overflow. Để có thể nhập vào i giá trị lớn hơn thì phải khai báo i AS LONG
Nhưng sao mới sáng sớm mà nó chạy chậm thế nhỉ? - Vừa ăn xong cơ mà :>- Em muốn nhấn cái là nó có kết quả luôn cơ ^^ Không biết có sửa được không anh nhỉ
 
Upvote 0
Nhưng sao mới sáng sớm mà nó chạy chậm thế nhỉ? - Vừa ăn xong cơ mà :>- Em muốn nhấn cái là nó có kết quả luôn cơ ^^ Không biết có sửa được không anh nhỉ
Thao tác đọc từng ô hay ghi từng ô trên sheet rất "đắt" về thời gian. Vì thế khi vùng thao tác quá lớn thì người ta đọc toàn vùng vào MẢNG trong 1 nốt nhạc, và cũng trong 1 nốt nhạc đập MẢNG xuống sheet. Mọi thao tác khác thực hiệb trong mảng.
Mã:
Sub Rnd_2()
    Dim i As Long, kq()
    Dim randomValue As Single
    ReDim kq(2 To 999999, 1 To 1)
    Range("D1").Value = "Original numbers2"
    i = 2
    Do While i < 1000000
        randomValue = RndSpecial(1, 1000)
        kq(i, 1) = randomValue
        i = i + 1
    Loop
    Range("D2:D999999").Value = kq

    MsgBox "Xong phim"
End Sub
Bạn mới học mà đã kịp học thói quen rất xấu. Ít nhất cũng chả tốt gì.

Tại sao lại

Range("D1") = "Original numbers2"

mà không tường minh là

Range("D1").Value = "Original numbers2"

???
 
Upvote 0
Thao tác đọc từng ô hay ghi từng ô trên sheet rất "đắt" về thời gian. Vì thế khi vùng thao tác quá lớn thì người ta đọc toàn vùng vào MẢNG trong 1 nốt nhạc, và cũng trong 1 nốt nhạc đập MẢNG xuống sheet. Mọi thao tác khác thực hiệb trong mảng.
Mã:
Sub Rnd_2()
    Dim i As Long, kq()
    Dim randomValue As Single
    ReDim kq(2 To 999999, 1 To 1)
    Range("D1").Value = "Original numbers2"
    i = 2
    Do While i < 1000000
        randomValue = RndSpecial(1, 1000)
        kq(i, 1) = randomValue
        i = i + 1
    Loop
    Range("D2:D999999").Value = kq

    MsgBox "Xong phim"
End Sub
Bạn mới học mà đã kịp học thói quen rất xấu. Ít nhất cũng chả tốt gì.

Tại sao lại

Range("D1") = "Original numbers2"

mà không tường minh là

Range("D1").Value = "Original numbers2"

???
Em đã đọc bài của anh ạ ^^ Nhưng mà anh ! Lúc mà em sắp xếp ở cái hàm mà em viết ấy . Em cũng toàn dùng mảng cơ mà nó vẫn chậm vậy :> Anh lại cho em cách khắc phục với ^^
1653859119711.png
Bạn mới học mà đã kịp học thói quen rất xấu. Ít nhất cũng chả tốt gì.

Tại sao lại

Range("D1") = "Original numbers2"

mà không tường minh là

Range("D1").Value = "Original numbers2"

???
Dạ vâng ạ ! Em sẽ nhìn nhận một cách nghiêm túc :>
 
Upvote 0
Nhưng mà anh ! Lúc mà em sắp xếp ở cái hàm mà em viết ấy . Em cũng toàn dùng mảng cơ mà nó vẫn chậm vậy :>
Rõ ràng tôi nói về Sub Rnd_2. Và bài #3 bạn cũng trích Sub Rnd_2 rồi ý kiến. Bây giờ bạn lại chuyển sang nói cái gì? Hỏi gì thì cũng phải rõ ràng.
Muốn chuyển sang hỏi gì thì cũng phải đưa code ra. Tôi mắt kém không nhìn rõ cái gì trong ảnh của bạn. Mà thực ra mọi cái mờ hết chứ có gì đâu.
 
Upvote 0
Rõ ràng tôi nói về Sub Rnd_2. Và bài #3 bạn cũng trích Sub Rnd_2 rồi ý kiến. Bây giờ bạn lại chuyển sang nói cái gì? Hỏi gì thì cũng phải rõ ràng.
Muốn chuyển sang hỏi gì thì cũng phải đưa code ra. Tôi mắt kém không nhìn rõ cái gì trong ảnh của bạn. Mà thực ra mọi cái mờ hết chứ có gì đâu.
Dạ vâng ạ ! Thế để em upload code lên trên này luôn cho rõ . Hiện tại thì khi sau khi random 1 triệu dòng xong thì em muốn sắp xếp nhưng code bên dưới nó chạy lâu quá dù nó đã thao tác với mảng . Em muốn anh sửa lại code cho em để nó chạy được đã ạ

PHP:
'sap xep



Public Sub Test(ByVal S As Integer, ByRef A() As Variant)

Dim i As Long , j As Long , jc As Long, N1 As Long, N2 As Long

Dim t As Double

N1 = LBound(A)

N2 = UBound(A)

For i = N1 To N2 - 1

    jc = i

    For j = i + 1 To N2

        If S = 1 Then

            If A(jc, 1) > A(j, 1) Then

                jc = j

            End If

        Else

            If A(jc, 1) < A(j, 1) Then

                jc = j

            End If

        End If

    Next j

    If jc <> i Then

        t = A(i, 1)

        A(i, 1) = A(jc, 1)

        A(jc, 1) = t

    End If

Next i

End Sub



[B]'Sắp xếp giảm dần  (1 triệu dòng)[/B]

Private Sub Test6()

Dim Rng As Range, B(), i As Long

Set Rng = Range("D2:D999999")

B() = Rng.Value

Call Test(0, B())

Range("E2:E999999") = B()

End Sub
 
Upvote 0
Dạ vâng ạ ! Thế để em upload code lên trên này luôn cho rõ . Hiện tại thì khi sau khi random 1 triệu dòng xong thì em muốn sắp xếp nhưng code bên dưới nó chạy lâu quá dù nó đã thao tác với mảng . Em muốn anh sửa lại code cho em để nó chạy được đã ạ
Mảng gần 1 triệu phần tử không phải loại nhỏ con, còn thuật toán sort mà bạn dùng không phải là loại vô địch về tốc độ.

Bạn thử xem code sau sắp xếp có chuẩn không.

Mã:
Public Sub QuickSort(Arr, iLo As Long, iHi As Long, col_sort As Long, sortAtoZ As Boolean)
'    Arr la mang 2 chieu can sap xep
'    col_sort la chi so cua cot dang duoc sap xep
'    sortAtoZ xac dinh cach sap xep tang hay giam trong cot cot_sort
'    chi sap xep tu dong iLo toi iHi. Vd. mang co dong tu 1 toi 200 nhung ta muon chi sap xep tu dong 3 toi 200 con 2 dong dau giu nguyen vi tri thi iLo = 3, iHi = 200
'    Hoac vd. trong mang co TIEU DE o dong 1. Cha ly gi lai di sap xep ca? TIEU DE, vi the iLo = 2 - TIEU DE de nguyen o dong 1.
Dim Lo As Long, Hi As Long, iMid, DoChange As Boolean, s
'Dim Lo_index As Long, Hi_index As Long

Do
    Lo = iLo
    Hi = iHi
   
    iMid = Arr((Lo + Hi) \ 2, col_sort)
    Do
        If sortAtoZ Then
            Do While Arr(Lo, col_sort) < iMid
                Lo = Lo + 1
            Loop
            Do While Arr(Hi, col_sort) > iMid
                Hi = Hi - 1
            Loop
        Else
            Do While Arr(Lo, col_sort) > iMid
                Lo = Lo + 1
            Loop
            Do While Arr(Hi, col_sort) < iMid
                Hi = Hi - 1
            Loop
        End If
       
        If Lo <= Hi Then
            If sortAtoZ Then
                DoChange = (Arr(Lo, col_sort) > Arr(Hi, col_sort))
            Else
                DoChange = (Arr(Lo, col_sort) < Arr(Hi, col_sort))
            End If
            If DoChange Then
                s = Arr(Lo, col_sort)
                Arr(Lo, col_sort) = Arr(Hi, col_sort)
                Arr(Hi, col_sort) = s
            End If
           
            Lo = Lo + 1
            Hi = Hi - 1
        End If
    Loop Until Lo > Hi
    If Hi > iLo Then QuickSort Arr, iLo, Hi, col_sort, sortAtoZ
    iLo = Lo
Loop Until Lo >= iHi
End Sub

Sub Test6()
Dim B()
  
    B = Range("D2:D999999").Value
  
    QuickSort B, LBound(B, 1), UBound(B, 1), 1, True
  
    Range("E2:E999999") = B
  
    MsgBox "Xong phim"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
If Hi > iLo Then QuickSort Arr, iLo, Hi, col_sort, sortAtoZ iLo = Lo
Anh ơi ! Cái chỗ QuickSort Arr, iLo, Hi, col_sort, sortAtoZ nó có ý nghĩa là gì với giá trị của nó là thế nào ạ ? Anh giải thích giúp em với . Em ngồi cả sáng để hiểu cái bài này rồi . Mà không biết lúc anh tạo ra code này có lâu không :>
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi ! Cái chỗ QuickSort Arr, iLo, Hi, col_sort, sortAtoZ nó có ý nghĩa là gì với giá trị của nó là thế nào ạ ? Anh giải thích giúp em với . Em ngồi cả sáng để hiểu cái bài này rồi . Mà không biết lúc anh tạo ra code này có lâu không :>
Cái dòng bạn trích là sự gọi procedure từ trong lòng của nó. Tiếng Việt gọi là ĐỆ QUY.

Còn về code thì đó là implement của thuật toán Quick Sort mà bạn. Có những bài toán nó có từ ngàn đời, và ngàn đời sau cũng sẽ có vấn đề đó. Những bài toán đó đều đã có lời giải, có thuật toán kiểu sơ đồ khối, hoặc các bước đi. Có thuật toán đó thì implement nó trong Delphi, VB, VBA, ... Thế thôi.

Vd. có bài toán: Có mạng lưới đường đi, từ A tới B có thể có rất nhiều đường đi. Hãy tìm đường đi ngắn nhất. Tổ tiên con người đã phải giải bài toán này, chúng ta cũng cần giải bài toán này, và chắc chắn con cháu sau này cũng phải giải bài toán này. Vì thế người ta đã nghiên cứu và tìm ra thuật toán. Việc cần làm là implement trong ngôn ngữ được chọn thôi.

Nói cho cùng, có thuật toán rồi thì cần cù làm bằng tay cũng ra. Chỉ có điều vd. mảng 1 triệu phần tử thì làm cả đời à. Vì thế cần viết code để máy làm thay. Máy không mệt mà làm cực nhanh, không nhầm lẫn do sơ ý mệt mỏi, mất tập trung.
 
Upvote 0
Cái dòng bạn trích là sự gọi procedure từ trong lòng của nó. Tiếng Việt gọi là ĐỆ QUY.

Còn về code thì đó là implement của thuật toán Quick Sort mà bạn. Có những bài toán nó có từ ngàn đời, và ngàn đời sau cũng sẽ có vấn đề đó. Những bài toán đó đều đã có lời giải, có thuật toán kiểu sơ đồ khối, hoặc các bước đi. Có thuật toán đó thì implement nó trong Delphi, VB, VBA, ... Thế thôi.

Vd. có bài toán: Có mạng lưới đường đi, từ A tới B có thể có rất nhiều đường đi. Hãy tìm đường đi ngắn nhất. Tổ tiên con người đã phải giải bài toán này, chúng ta cũng cần giải bài toán này, và chắc chắn con cháu sau này cũng phải giải bài toán này. Vì thế người ta đã nghiên cứu và tìm ra thuật toán. Việc cần làm là implement trong ngôn ngữ được chọn thôi.

Nói cho cùng, có thuật toán rồi thì cần cù làm bằng tay cũng ra. Chỉ có điều vd. mảng 1 triệu phần tử thì làm cả đời à. Vì thế cần viết code để máy làm thay. Máy không mệt mà làm cực nhanh, không nhầm lẫn do sơ ý mệt mỏi, mất tập trung.
Dạ vâng ạ ! Em cảm ơn anh nhiều ^^ . Để em tìm hiểu rồi có gì không hiểu thì em sẽ thông báo sau ạ ( Em phải tìm hiểu về đệ quy đã -Sắp sập nguồn- ) :>
 
Upvote 0
Oánh dấu cái QuickSort để phòng hồi khác tìm mỏi mắt không thấy.
 
Upvote 0
Web KT

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

Back
Top Bottom