Liệt kê giá trị theo điều kiện - VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

RedbullBC

Thành viên mới
Tham gia
8/9/21
Bài viết
12
Được thích
1
Em có tập tọe viết tý cốt cách, nhưng đang bị vướng 1 tý mong các bác chỉ giáo ạ
- Em muốn hiển thị các giá trị như điều kiện, nhưng khi run ( nút lá cờ) lại chỉ hiện thị được 1 giá trị cuối cùng, em chưa hiểu vì sao, mong các bác sửa giúp ạ
- File em để bên dưới ạ
 

File đính kèm

  • ★BASIC★.xlsm
    391.7 KB · Đọc: 17
Em có tập tọe viết tý cốt cách, nhưng đang bị vướng 1 tý mong các bác chỉ giáo ạ
- Em muốn hiển thị các giá trị như điều kiện, nhưng khi run ( nút lá cờ) lại chỉ hiện thị được 1 giá trị cuối cùng, em chưa hiểu vì sao, mong các bác sửa giúp ạ
- File em để bên dưới ạ
Sửa thế này coi sao nào
Mã:
Option Explicit
Sub NVL()
    Dim i, j, k As Double
    Dim b() As Variant, a()
    Dim m As Integer
    With Sheets("Nvalue")
    b = .Range("D4:E" & .Range("D" & Rows.Count).End(3).Row).Value
    ReDim a(1 To UBound(b), 1 To 2)
    For j = 1 To UBound(b)
        If b(j, 1) >= 30 And b(j, 1) <= 44 Then
            m = m + 1
            a(m, 1) = b(j, 1)
            a(m, 2) = b(j, 2)
        End If
    Next j
    .Range("M4").Resize(m, 2).Value = a
    End With
End Sub
 
Upvote 0
Sửa thế này coi sao nào
Mã:
Option Explicit
Sub NVL()
    Dim i, j, k As Double
    Dim b() As Variant, a()
    Dim m As Integer
    With Sheets("Nvalue")
    b = .Range("D4:E" & .Range("D" & Rows.Count).End(3).Row).Value
    ReDim a(1 To UBound(b), 1 To 2)
    For j = 1 To UBound(b)
        If b(j, 1) >= 30 And b(j, 1) <= 44 Then
            m = m + 1
            a(m, 1) = b(j, 1)
            a(m, 2) = b(j, 2)
        End If
    Next j
    .Range("M4").Resize(m, 2).Value = a
    End With
End Sub
chạy được bác ạ, nhưng bác có thể giải thích vì sao cái đoạn em viết nó lại chạy loạn lên và chỉ đưa về giá trị cuối cùng không ạ
cái của bác dùng kiểu viết nó hơi khác với cái thứ em đang học nên hơi khó thẩm thấu
 
Upvote 0
Người ta đang tập tành chứ có xin xỏ gì đâu. :D
Em có tập tọe viết tý cốt cách, nhưng đang bị vướng 1 tý mong các bác chỉ giáo ạ
- Em muốn hiển thị các giá trị như điều kiện, nhưng khi run ( nút lá cờ) lại chỉ hiện thị được 1 giá trị cuối cùng, em chưa hiểu vì sao, mong các bác sửa giúp ạ
- File em để bên dưới ạ
Code của bạn có cả đàn "chuột" chứ không phải chỉ 1 con nhưng tôi sẽ đặt trọng tâm vào câu hỏi của bạn là vì sao kết quả chỉ có 1 giá trị.
Kết quả chỉ có 1 giá trị được lặp lại nhiều lần là do vòng lặp i. Khi có giá trị thỏa điều kiện vòng lặp i đã ghi đè kết quả vào các giá trị trước đó nên kết quả cuối cùng mới như vậy.
 
Upvote 0
Người ta đang tập tành chứ có xin xỏ gì đâu. :D

Code của bạn có cả đàn "chuột" chứ không phải chỉ 1 con nhưng tôi sẽ đặt trọng tâm vào câu hỏi của bạn là vì sao kết quả chỉ có 1 giá trị.
Kết quả chỉ có 1 giá trị được lặp lại nhiều lần là do vòng lặp i. Khi có giá trị thỏa điều kiện vòng lặp i đã ghi đè kết quả vào các giá trị trước đó nên kết quả cuối cùng mới như vậy.
dạ vâng em hiểu rồi nhưng giờ sửa nó thì sửa thế nào cho nó khỏi đè kết quả ạ
Bài đã được tự động gộp:

Người ta đang tập tành chứ có xin xỏ gì đâu. :D

Code của bạn có cả đàn "chuột" chứ không phải chỉ 1 con nhưng tôi sẽ đặt trọng tâm vào câu hỏi của bạn là vì sao kết quả chỉ có 1 giá trị.
Kết quả chỉ có 1 giá trị được lặp lại nhiều lần là do vòng lặp i. Khi có giá trị thỏa điều kiện vòng lặp i đã ghi đè kết quả vào các giá trị trước đó nên kết quả cuối cùng mới như vậy.
cả 1 đoàn chuột, bác ví dụ rất sinh động
 
Upvote 0
dạ vâng em hiểu rồi nhưng giờ sửa nó thì sửa thế nào cho nó khỏi đè kết quả ạ
Bỏ 1 vòng lặp đi coi sao
Mã:
Sub NVL()
    Dim i, j, k As Double
    Dim b(100, 2) As Variant
    Dim m As Integer
    m = 0
    For j = 1 To 100
        b(j, 1) = Sheets("Nvalue").Cells(j + 3, 4)
        b(j, 2) = Sheets("Nvalue").Cells(j + 3, 5)
        If b(j, 1) >= 30 And b(j, 1) <= 44 Then
            m = m + 1
            Sheets("Nvalue").Cells(m + 4, 13) = b(j, 1)
            Sheets("Nvalue").Cells(m + 4, 14) = b(j, 2)
        End If
    Next j
End Sub
 
Upvote 0
Bỏ 1 vòng lặp đi coi sao
Mã:
Sub NVL()
    Dim i, j, k As Double
    Dim b(100, 2) As Variant
    Dim m As Integer
    m = 0
    For j = 1 To 100
        b(j, 1) = Sheets("Nvalue").Cells(j + 3, 4)
        b(j, 2) = Sheets("Nvalue").Cells(j + 3, 5)
        If b(j, 1) >= 30 And b(j, 1) <= 44 Then
            m = m + 1
            Sheets("Nvalue").Cells(m + 4, 13) = b(j, 1)
            Sheets("Nvalue").Cells(m + 4, 14) = b(j, 2)
        End If
    Next j
End Sub
Ơ, đúng thật, sao lại có thể đẳng cấp như thế được nhỉ.
Không ngờ chỉ 1 chỉ điểm của bác mà thay đổi cả cục diện của một nốt thắt.
Trân thành cảm ơn Bác Thuấn. Vinh Danh
Bài đã được tự động gộp:

Người ta đang tập tành chứ có xin xỏ gì đâu. :D

Code của bạn có cả đàn "chuột" chứ không phải chỉ 1 con nhưng tôi sẽ đặt trọng tâm vào câu hỏi của bạn là vì sao kết quả chỉ có 1 giá trị.
Kết quả chỉ có 1 giá trị được lặp lại nhiều lần là do vòng lặp i. Khi có giá trị thỏa điều kiện vòng lặp i đã ghi đè kết quả vào các giá trị trước đó nên kết quả cuối cùng mới n
Bỏ 1 vòng lặp đi coi sao
Mã:
Sub NVL()
    Dim i, j, k As Double
    Dim b(100, 2) As Variant
    Dim m As Integer
    m = 0
    For j = 1 To 100
        b(j, 1) = Sheets("Nvalue").Cells(j + 3, 4)
        b(j, 2) = Sheets("Nvalue").Cells(j + 3, 5)
        If b(j, 1) >= 30 And b(j, 1) <= 44 Then
            m = m + 1
            Sheets("Nvalue").Cells(m + 4, 13) = b(j, 1)
            Sheets("Nvalue").Cells(m + 4, 14) = b(j, 2)
        End If
    Next j
En
[/QUOTE]
[/QUOTE]

Ơ, đúng thật, sao lại có thể đẳng cấp như thế được nhỉ.
Không ngờ chỉ 1 chỉ điểm của bác mà thay đổi cả cục diện của một nốt thắt.
Trân thành cảm ơn Bác Thuấn. Vinh Danh
em đã hiểu , đã hiểu vì sao lại xuất hiện đàn chuột thưa bác
 
Upvote 0
em hiểu rồi nhưng giờ sửa nó thì sửa thế nào cho nó khỏi đè kết quả
Câu này mâu thuẫn nhé. Hiểu rồi thì phải sửa được, không sửa được nghĩa là chưa hiểu.
--
Tôi nói code của bạn có cả một đàn chuột nghĩa là code của bạn có nhiều vấn đề chứ không phải chỉ 1 tý (chuột = tý).
Ngoài vấn đề làm ảnh hưởng kết quả như trên thì còn các vấn đề sau:
  • Khai báo thừa biến k;
  • Các biến i, j không cần khai báo kiểu Double, nên khai báo kiểu Long;
  • Trong VBA, khi khai báo mảng nên khai báo luôn chỉ số dưới (Dim b(1 to 100,1 to 2)), nếu không chỉ số dưới mặc định sẽ là 0 (nếu không có khai báo Option Base 1);
  • Mảng b là không cần thiết và không ai nạp giá trị của một vùng vào mảng bằng bằng vòng lặp như vậy cả;
  • m là biến cục bộ, giá trị mặc định ban đầu là 0, không cần phải đặt m = 0.
 
Upvote 0
Câu này mâu thuẫn nhé. Hiểu rồi thì phải sửa được, không sửa được nghĩa là chưa hiểu.
--
Tôi nói code của bạn có cả một đàn chuột nghĩa là code của bạn có nhiều vấn đề chứ không phải chỉ 1 tý (chuột = tý).
Ngoài vấn đề làm ảnh hưởng kết quả như trên thì còn các vấn đề sau:
  • Khai báo thừa biến k;
  • Các biến i, j không cần khai báo kiểu Double, nên khai báo kiểu Long;
  • Trong VBA, khi khai báo mảng nên khai báo luôn chỉ số dưới (Dim b(1 to 100,1 to 2)), nếu không chỉ số dưới mặc định sẽ là 0 (nếu không có khai báo Option Base 1);
  • Mảng b là không cần thiết và không ai nạp giá trị của một vùng vào mảng bằng bằng vòng lặp như vậy cả;
  • m là biến cục bộ, giá trị mặc định ban đầu là 0, không cần phải đặt m = 0.
Vâng em cảm ơn anh đã chỉ bảo ạ , em xin tiếp thu và ghi nhận ạ
 
Upvote 0
Web KT

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

Back
Top Bottom