Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Mình có đoạn codec sau nhưng không biết sai như thế nào, nhờ mọi người xem giúp với.

Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
Dayso(i) = Sheet1.Range("A" & i).Value
Next i
Max = 0
For j = 1 To UBound(Dayso, 1)
If Dayso(j) > Max Then
Sheet1.Range("B" & j) = Dayso(j)
Max = Sheet1.Range("B" & j).Value
Sheet1.Range("B" & j).ClearContents
End If
Next j
Sheet1.Range("B1") = Max
End Sub
 
Upvote 0
Mình có đoạn codec sau nhưng không biết sai như thế nào, nhờ mọi người xem giúp với.

Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
Dayso(i) = Sheet1.Range("A" & i).Value
Next i
Max = 0
For j = 1 To UBound(Dayso, 1)
If Dayso(j) > Max Then
Sheet1.Range("B" & j) = Dayso(j)
Max = Sheet1.Range("B" & j).Value
Sheet1.Range("B" & j).ClearContents
End If
Next j
Sheet1.Range("B1") = Max
End Sub
Cái này hình như đang tìm số lớn nhất thì phải. Thay vì bạn đưa Code thì đính kèm file và yêu cầu thì dễ hình dung hơn là đọc và dich Code trên :p
 
Upvote 0
Mình gửi file lên mong mọi người góp ý giúp. Cảm ơn
 

File đính kèm

  • Tim Max.xlsm
    17 KB · Đọc: 10
Upvote 0
Mình gửi file lên mong mọi người góp ý giúp. Cảm ơn
Thế thì viết như thế này cho gọn hơn
PHP:
Sub Rectangle2_Click()
    Dim sArr(), I As Long, Max As Long
With Sheet1
    sArr = .Range("A1", .Range("A" & Rows.Count).End(3)).Value
    Max = 0
    For I = 1 To UBound(sArr)
        If sArr(I, 1) > Max Then Max = sArr(I, 1)
    Next I
    .Range("B1") = Max
End With
End Sub
 
Upvote 0
Mình có đoạn codec sau nhưng không biết sai như thế nào, nhờ mọi người xem giúp với.

Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
Dayso(i) = Sheet1.Range("A" & i).Value
Next i
Max = 0
For j = 1 To UBound(Dayso, 1)
If Dayso(j) > Max Then
Sheet1.Range("B" & j) = Dayso(j)
Max = Sheet1.Range("B" & j).Value
Sheet1.Range("B" & j).ClearContents
End If
Next j
Sheet1.Range("B1") = Max
End Sub
Tôi viết lại như sau
PHP:
Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
    Dayso(i) = Sheet1.Range("A" & i).Value
    Next i
'Max = 0     'Luu y 1
Max = Dayso(1)
'For j = 1 To UBound(Dayso, 1)
For j = 2 To UBound(Dayso, 1)
    If Dayso(j) > Max Then
'        Sheet1.Range("B" & j) = Dayso(j)  'Lệnh này thừa
'        Max = Sheet1.Range("B" & j).Value
        Max = Dayso(j)
 '       Sheet1.Range("B" & j).ClearContents    'Lệnh này thừa
        End If
    Next j
Sheet1.Range("B1") = Max
End Sub

và nó cho max của dãy số trong cột A. Chú ý
Luu y 1 Phải thay
Max = 0 bằng Max = Dayso(1,1) để tránh khi dãy số toàn số âm[/PHP]

Có thể kg cần biến Dayso và chỉ cần 1 vòng For
 
Upvote 0
Thế thì viết như thế này cho gọn hơn


Điểm mấu chốt là biến max để là long hoặc integer rất dễ gây lỗi bị chàn, vì chúng chỉ chứa được giá trị khoảng 2 tỷ, chưa kể sẽ có hiện tượng ép kiểu do vậy kết quả sẽ bị làm tròn. Vả lại cũng phải khởi tạo cho biến max hợp lý.

Mã:
Sub Rectangle20_Click()
    Dim sArr, vTemp As Variant, dblMax As Double
    
    

    sArr = Sheet1.Range("A1", Sheet1.Range("A" & Rows.Count).End(3)).Value
    If Not IsArray(sArr) Then
        dblMax = sArr
        'de phong truong hop chi co mot o.
    Else
        dblMax = sArr(1, 1)
        For Each vTemp In sArr
            If vTemp > dblMax Then
                dblMax = vTemp
            End If
        Next
    End If
 
    Sheet1.Range("B1") = dblMax



End Sub

Cứ dùng cái hàm Max trong excel hóa lại đơn giản.
 
Upvote 0
Sub Rectangle2_Click()
Dim sArr(), I As Long, Max As Long
With Sheet1
sArr
= .Range("A1", .Range("A" & Rows.Count).End(3)).Value
Max
= 0
For I = 1 To UBound(sArr)
If
sArr(I, 1) > Max Then Max = sArr(I, 1)
Next I
.Range("B1") = Max
End With
End Sub
Uổi, mà làm sao để có cái code màu xanh này thế chị?
 
Upvote 0
Vãi, em vốn ghét thằng variant mà cuối cùng phải bắt buộc dùng nó. Chỉ có cái hàm Max thôi mà viết sai lên sai xuống, test linh tinh dữ liệu bị quăng error vô mặt.
Code này em thấy tạm chấp nhận được thôi, bà con có code # hay hơn góp ý.
Trên các cell cột A, bà con nhập thỏa mái, càng linh tinh càng tốt, rỗng, số, số bự bà cố, chuỗi, chuỗi và số, biểu thức...

Mã:
Option Explicit

Sub Rectangle2_Click()
    Dim vArr() As Variant
    Dim vMax As Variant, vTemp As Variant
    Dim lR As Long, I As Long
 
    ' Truong hop cot A khong co du lieu hay chi cell A1 co du lieu rong, text, number hay linh tinh
    vMax = Val([A1])
    lR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
  
    If (lR > 1) Then
        ' Có dữ liệu từ A2 trở đi
        vArr = Sheet1.Range("A1:A" & lR).Value ' If lR = 1 thì lệnh này nó quăng error vô mặt em cái đùng
        For I = 2 To UBound(vArr)       ' Bo qua cell A1
            vTemp = Val(vArr(I, 1))     ' Truong hop cell A[I] la du lieu rong, text, number hay linh tinh, không dùng Val thì bị quăng error cái đùng lần nữa :')
            If vTemp > vMax Then
                vMax = vTemp
            End If
        Next I
    End If
 
    Sheet1.Range("B1") = vMax
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm Val là hàm nguy hiểm bỏ bố
A1 = "1,000.0"
A2 = "2.000,0"
A3 = "1.000,0"
A4 = "2,000.0"
Thiệt ra là thằng nào lớn hơn thằng nào?
 
Upvote 0
Mình có code 1 đoạn này. Input 1 mảng từ 1 bảng có sẵn. Transpose ra được dữ liệu rồi nhưng khi so sánh biến nhập vào với từng giá trị của mảng thì chỉ ra được 1 giá trị đầu. Còn lại báo lỗi Subscript out of Range 404. Máy báo lỗi ở dòng.

If Sheets("CleanerSheet").Cells(d, "B").Value > data(i, 1) And Sheets("CleanerSheet").Cells(d, "B").Value <= data(i + 1, 1) Then


Cảm ơn mọi người trước ạ

PHP:
Option Explicit

Sub Button1_Click()
Dim a, b, c, d, i As Integer
Dim data(1 To 80, 1 To 2) As Variant
Dim LastRow As Integer

    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With
 
c = 1
For a = 2 To 16
For b = 12 To 8 Step -1
    data(c, 1) = Sheets("2018").Cells(b, a).Value
    c = c + 1
Next b
Next a

c = 1
For a = 2 To 16
For b = 12 To 8 Step -1
    data(c, 2) = Sheets("2018").Cells(13, a).Value & Sheets("2018").Cells(b, "A").Value
    c = c + 1
Next b
Next a

Sheets("CleanerSheet").Range("E6:F99").Value = Worksheets.Application.Transpose(data)

For d = 3 To LastRow

     Sheets("CleanerSheet").Cells(d, "B").Select
     For i = 1 To 80
       If Sheets("CleanerSheet").Cells(d, "B").Value > data(i, 1) And Sheets("CleanerSheet").Cells(d, "B").Value <= data(i + 1, 1) Then
          Sheets("CleanerSheet").Cells(d, "C").Value = data(i + 1, 1)
          Sheets("CleanerSheet").Cells(d, "D").Value = data(i + 1, 2)
          i = i + 1
       End If
     Next i
Next d

End Sub
 
Upvote 0
Định bôi nhưng code không cho bôi nên đành trích dẫn luôn :D.
Tềnh hềnh là hơi căng...
1. Lỗi dòng này:
Mã:
Sheets("CleanerSheet").Cells(d, "B").Select
khi Sheets("CleanerSheet") không hiện hành.
Khắc phục:
PHP:
Sheets("CleanerSheet").Select 'Thêm dòng này'
For d = 3 To LastRow
2. Lỗi gọi phần tử của biến mảng data():
Mã:
For i = 1 To 80
       If sal > data(1, i) And sal <= data(1, i + 1) Then
vì khai báo:
Mã:
Dim data(1 To 80, 1 To 2)
Khai báo chỉ số chiều thứ hai của mảng data chạy từ 1 tới 2, còn khi gọi tới phần tử của nó thì lại chạy từ 1 tới 80, nên i>=3 là tèo téo teo.

Lỗi tới chỗ đó là hết hiểu để sửa.

Có lẽ mình dành thời gian đọc tham khảo mấy bài sau: Bài 0-10.
 
Upvote 0
Tềnh hềnh là hơi căng...
1. Lỗi dòng này:
Mã:
Sheets("CleanerSheet").Cells(d, "B").Select
khi Sheets("CleanerSheet") không hiện hành.
Khắc phục:
PHP:
Sheets("CleanerSheet").Select 'Thêm dòng này'
For d = 3 To LastRow
2. Lỗi gọi phần tử của biến mảng data():
Mã:
For i = 1 To 80
       If sal > data(1, i) And sal <= data(1, i + 1) Then
vì khai báo:
Mã:
Dim data(1 To 80, 1 To 2)
Khai báo chỉ số chiều thứ hai của mảng data chạy từ 1 tới 2, còn khi gọi tới phần tử của nó thì lại chạy từ 1 tới 80, nên i>=3 là tèo téo teo.

Lỗi tới chỗ đó là hết hiểu để sửa.

Có lẽ mình dành thời gian đọc tham khảo mấy bài sau: Bài 0-10.

Em cũng mới chuyển code từ VB sang VBA nên cũng có nhiều chỗ chưa hiểu. Cái mảng em đặt theo biến như trên theo em hiểu là fix cố định gồm 80 dòng và 2 cột nhưng khi transpose ra thì lại là 80 cột và 2 dòng. Thế khi mình khai báo như trên thì mảng của mình là 80 cột 2 dòng hay là 80 dòng 2 cột ạ?
 
Upvote 0
PHP:
FileQLSX.Sheets("BANG_TINH").Range("B22:Z" & LastRowNo).SpecialCells(xlCellTypeVisible).Copy
 
 FileBangQD.Sheets("CongLamKH").Range("D3").PasteSpecial xlPasteValues
Anh, chị cho em hỏi, em có đoạn code copy như trên, chỉ copy những dữ liệu hiển thị không copy dữ liệu ẩn. Em muốn chuyển sang dùng ADO mà không biết trong ADO bỏ qua giá trị ẩn như nào. Anh, chị giúp em với ạ. Em cảm ơn. Dữ liệu của em không theo thứ tự nhất định.
PHP:
Str5 = "Select * from [BANG_TINH$B22:Z] where F1 is not null"
    FileBangQD.Sheets("ThongSo").Range("D3").CopyFromRecordset cnn.Execute(Str5)
Em có dùng đoạn code trên để thay thế mà chỉ copy được một dòng.
 
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom