Giúp sửa code đổi số dương sang số âm cho tốc độ nhanh hơn

Liên hệ QC

Phúc Lộc Thọ

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
12/8/22
Bài viết
32
Được thích
4
Chào mọi người. Mình có dùng đoạn code sau để chuyển số Dương sang Số Âm, Nhưng dữ liệu mình có 2 vùng tổng là 20.000 dòng, code chạy khá lâu, nhờ mọi người sửa giúp code để chạy nhanh hơn. Em xin chân thành cảm ơn đại gia đình



Sub DoiDuongSangAm()
Application.ScreenUpdating = False
Dim x As Long, Y As Long

For x = 20001 To 30000
If Range("A" & x).Value <> "" Then
Range("A" & x) = Range("A" & x) * -1
Else
Range("A" & x) = Range("A" & x)
End If
Next x

For Y = 40001 To 50000
If Range("A" & Y).Value <> "" Then
Range("A" & Y) = Range("A" & Y) * -1
Else
Range("A" & Y) = Range("A" & Y)
End If
Next Y
Application.ScreenUpdating = True
End Sub
 
Chào mọi người. Mình có dùng đoạn code sau để chuyển số Dương sang Số Âm, Nhưng dữ liệu mình có 2 vùng tổng là 20.000 dòng, code chạy khá lâu, nhờ mọi người sửa giúp code để chạy nhanh hơn. Em xin chân thành cảm ơn đại gia đình



Sub DoiDuongSangAm()
Application.ScreenUpdating = False
Dim x As Long, Y As Long

For x = 20001 To 30000
If Range("A" & x).Value <> "" Then
Range("A" & x) = Range("A" & x) * -1
Else
Range("A" & x) = Range("A" & x)
End If
Next x

For Y = 40001 To 50000
If Range("A" & Y).Value <> "" Then
Range("A" & Y) = Range("A" & Y) * -1
Else
Range("A" & Y) = Range("A" & Y)
End If
Next Y
Application.ScreenUpdating = True
End Sub
Đọc từng ô trên sheet hay nhập giá trị vào từng ô trên sheet rất tốn thời gian nên chỉ làm thế khi ít dữ liệu. Khi dữ liệu nhiều thì: đọc vùng dữ liệu A vào mảng -> chỉnh sửa các giá trị của mảng -> đập mảng vào lại vùng A. Đọc vùng trên sheet vào mảng và đập mảng xuống sheet thì tôi đã làm trong code khi giúp bạn bài trước: đọc vùng vào mảng dulieu và đập mảng kq vào sheet. Cứ thế mà bắt chước.
 
Upvote 0
Chào mọi người. Mình có dùng đoạn code sau để chuyển số Dương sang Số Âm, Nhưng dữ liệu mình có 2 vùng tổng là 20.000 dòng, code chạy khá lâu, nhờ mọi người sửa giúp code để chạy nhanh hơn. Em xin chân thành cảm ơn đại gia đình
Thử thế này đi xem nào anh
Mã:
Sub ABC()
    Dim arr(), i&
    arr = Range("A20001:A50000").Value
    For i = 1 To UBound(arr)
        If arr(i, 1) <> "" Then
            arr(i, 1) = -arr(i, 1)
        End If
    Next
    Range("A20001").Resize(UBound(arr)).Value = arr
End Sub
 
Upvote 0
Chào mọi người. Mình có dùng đoạn code sau để chuyển số Dương sang Số Âm, Nhưng dữ liệu mình có 2 vùng tổng là 20.000 dòng, code chạy khá lâu, nhờ mọi người sửa giúp code để chạy nhanh hơn. Em xin chân thành cảm ơn đại gia đình



Sub DoiDuongSangAm()
Application.ScreenUpdating = False
Dim x As Long, Y As Long

For x = 20001 To 30000
If Range("A" & x).Value <> "" Then
Range("A" & x) = Range("A" & x) * -1
Else
Range("A" & x) = Range("A" & x)
End If
Next x

For Y = 40001 To 50000
If Range("A" & Y).Value <> "" Then
Range("A" & Y) = Range("A" & Y) * -1
Else
Range("A" & Y) = Range("A" & Y)
End If
Next Y
Application.ScreenUpdating = True
End Sub

Code này chạy lần 2, nó đổi số âm sang dương. Hahahaha ...

.
 
Upvote 0
Thử thế này đi xem nào anh
Mã:
Sub ABC()
    Dim arr(), i&
    arr = Range("A20001:A50000").Value
    For i = 1 To UBound(arr)
        If arr(i, 1) <> "" Then
            arr(i, 1) = -arr(i, 1)
        End If
    Next
    Range("A20001").Resize(UBound(arr)).Value = arr
End Sub
Mình muốn từ dòng 20001 đến 30000 và 40001 đến 50000 mà . cái này nó chạy từ 20001 đến 50000 thì nát dữ liệu của em rồi Huhu
 
Upvote 0
Upvote 0
Gõ -1 vào một ô ngoài vùng -> Copy -> Chọn vùng A20001:30000 giữ Ctrl chọn tiếp A40001:50000 -> Paste Special -> Chọn Multiply -> Xong!
 
Upvote 0
Mình muốn từ dòng 20001 đến 30000 và 40001 đến 50000 mà . cái này nó chạy từ 20001 đến 50000 thì nát dữ liệu của em rồi Huhu
Lấy code ở bài #3.
Copy từ dòng 3 đến dòng 9.
Paste lại sau dòng 9. Tức là code từ dòng 3 đến dòng 9 sẽ lặp lại thành dòng 10-16.
Dòng 3, đổi 5 thành 3
Dòng 10 và 16, đổi 2 thành 4

Đừng có khóc với tôi là làm thủ công như vậy lâu quá nhé. Tôi gõ mớ chỉ dẫn này lâu hơn nhiều.
 
Upvote 0
Đây là cơ hội tốt cho bạn nào muốn thử code "dùng hàm Evaluate để thay thế vòng lặp".
Bạn nào muốn thử cho quen?
 
Upvote 0
Xin lỗi vì chen ngang, các bác cho em/con hỏi: Nếu so với tốc độ copy -1 rồi dán multiply thì có nhanh hơn không?
Đang nói tốc độ thực thi, bỏ qua việc kéo chuột xác định vùng cần dán.
 
Upvote 0
Đây là cơ hội tốt cho bạn nào muốn thử code "dùng hàm Evaluate để thay thế vòng lặp".
Bạn nào muốn thử cho quen?

TÔI MUỐN HỌC
Bài đã được tự động gộp:

Gõ -1 vào một ô ngoài vùng -> Copy -> Chọn vùng A20001:30000 giữ Ctrl chọn tiếp A40001:50000 -> Paste Special -> Chọn Multiply -> Xong!
dữ liệu CƠ Quan mình thường xuyên thay đổi Ví dụ 1 ngày thay đổi 100 lần, rồi ngày nào cũng bỏ thời gian ra làm 100 lần thủ công như bạn nói thì sao được
Bài đã được tự động gộp:

Làm thế mỏi tay lắm, ứ làm đâu. :p
Ví dụ 1 ngày Dữ liệu thay đổi 100 lần, rồi ngày nào cũng bỏ thời gian ra làm 100 lần thủ công như bạn nói . Bạn thật sự muốn vậy à
 
Lần chỉnh sửa cuối:
Upvote 0
TÔI MUỐN HỌC
-----------------------------

dữ liệu CƠ Quan mình thường xuyên thay đổi Ví dụ 1 ngày thay đổi 100 lần, rồi ngày nào cũng bỏ thời gian ra làm 100 lần thủ công như bạn nói thì sao được
------------------------------

Ví dụ 1 ngày Dữ liệu thay đổi 100 lần, rồi ngày nào cũng bỏ thời gian ra làm 100 lần thủ công như bạn nói . Bạn thật sự muốn vậy à

Dữ liệu thì chục ngàn dòng, thay đổi thì 15 phút 1 lần (24 giờ/100 = 0,24 giờ)

Gặp dân chơi chứng khoán làm bộ "học hỏi" rồi quý vị ơi.
 
Lần chỉnh sửa cuối:
Upvote 0
Dữ liệu thì chục ngàn dòng, thay đổi thì 15 phút 1 lần (24 giờ/100 = 0,24 giờ)

Gặp dân chơi chứng khoán làm bộ "học hỏi" rồi quý vị ơi.

Tôi cần code nhanh nhất có thể cho dữ liệu 20.000 dòng. Bạn có thể tư vấn tôi thuật toán.
 
Upvote 0
Tôi cần code nhanh nhất có thể cho dữ liệu 20.000 dòng. Bạn có thể tư vấn tôi thuật toán.
Tôi chả đã chỉ ra trong bài #2 cho bạn đấy thôi. Bạn chỉ chú trọng vào code nên lơ bài của tôi đi. Cái "thích" kia hôm nay mới có, hôm qua không có.

LẤY dữ liệu vào mảng -> duyệt từng phần tử của mảng thay vì duyệt từng ô trên sheet, và chỉnh sửa -> ĐẬP lại mảng xuống vùng dữ liệu.

Việc lấy dữ liệu vào mảng và đập dữ lệu từ mảng xuống sheet thì tôi đã làm trong chủ đề khác cho bạn. Mấy người khác cũng làm những việc như thế. Nếu bạn thực sự muốn học thì việc bắt chước chỉ là vấn đề 1, 2 ngày cho vấn đề LẤY và ĐẬP.

Trong chủ đề kia tôi cũng sử dụng Dictionary. Nếu bạn thực sự muốn học, tìm hiểu sâu thì chắc là bạn sẽ hỏi. Bạn không hỏi tức là bạn không có ý học.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cần code nhanh nhất có thể cho dữ liệu 20.000 dòng. Bạn có thể tư vấn tôi thuật toán.
Bạn học kiểu gì mà không chú ý vào câu đề nghị của người ta vậy?

Thuật toán gồm 2 phần:
1. phân biệt ra hai mảng và làm hai lần. Bài #10 có nói qua.
2. dùng hàm Evaluate trên cả mảng để tránh dùng vòng lặp.

Vả lại, 15 phút cập nhật 1 lần. Code nào chạy 15 giây thì đủ rồi. Cần gì phải nhanh nhất.
 
Upvote 0
Bạn học kiểu gì mà không chú ý vào câu đề nghị của người ta vậy?

Thuật toán gồm 2 phần:
1. phân biệt ra hai mảng và làm hai lần. Bài #10 có nói qua.
2. dùng hàm Evaluate trên cả mảng để tránh dùng vòng lặp.

Vả lại, 15 phút cập nhật 1 lần. Code nào chạy 15 giây thì đủ rồi. Cần gì phải nhanh nhất.

Tôi chả đã chỉ ra trong bài #2 cho bạn đấy thôi. Bạn chỉ chú trọng vào code nên lơ bài của tôi đi. Cái "thích" kia hôm nay mới có, hôm qua không có.

LẤY dữ liệu vào mảng -> duyệt từng phần tử của mảng thay vì duyệt từng ô trên sheet, và chỉnh sửa -> ĐẬP lại mảng xuống vùng dữ liệu.

Việc lấy dữ liệu vào mảng và đập dữ lệu từ mảng xuống sheet thì tôi đã làm trong chủ đề khác cho bạn. Mấy người khác cũng làm những việc như thế. Nếu bạn thực sự muốn học thì việc bắt chước chỉ là vấn đề 1, 2 ngày cho vấn đề LẤY và ĐẬP.

Trong chủ đề kia tôi cũng sử dụng Dictionary. Nếu bạn thực sự muốn học, tìm hiểu sâu thì chắc là bạn sẽ hỏi. Bạn không hỏi tức là bạn không có ý học.
Rất cảm ơn 2 bạn đã GIúp đỡ. Thật tình mình mới học nên không rành cho lắm, mong các bạn thông cảm. Mình chỉ cần hỏi 1 vài ví dụ thực tiễn để mình nghiên cứu Chức năng của Dictionary dùng để làm gì, cách sử dụng ra sao....Tôi đang nghiên cứu có gì không hiểu tôi sẽ hỏi. Chân thành cảm ơn 2 bạn đã giúp đỡ
 
Upvote 0
Tôi gợi ý loại code mà bản thân tôi sẽ sử dụng cho bạn nào cần học hỏi về kỹ thuật "viết code lười biếng".
Nên chú ý là code không chạy nhanh lắm, đừng nói đến chuyện "nhanh nhất". Bản thân tôi chỉ thích code nằm trong tầm kiểm soát của mình - tức là dễ dò chỗ sai, dễ chỉnh sửa.

Code nhanh tay nhất:
Sub NhanhTay()
[A20001:A30000] = [ IF(A20001:A30000 <> "", -A20001:A30000, "") ]
[A40001:A50000] = [ IF(A40001:A30000 <> "", -A40001:A50000, "") ]
End Sub

Code dễ sửa hơn:
Sub NhanhTayDeSua()
For Each rg In [ { "A20001:A30000", "A40001:A50000" } ]
Range(rg) = Evaluate( Replace("if(rg = """", """", -rg)", "rg", rg) )
Next rg
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom