Code Sort không chạy

Liên hệ QC

NguyenthiH

Thành viên mới đăng ký
Tham gia
11/12/16
Bài viết
931
Được thích
168
Giới tính
Nữ
Em có file nhập hàng hóa mới, sao em nhập hàng hóa mới mà code Sort không chạy, mong các anh chị giúp đỡ.
 

File đính kèm

  • Book1.xlsb
    28.8 KB · Đọc: 19
Em có file nhập hàng hóa mới, sao em nhập hàng hóa mới mà code Sort không chạy, mong các anh chị giúp đỡ.
Không phải là không chạy.Cái dữ liệu của bạn có cái dấu cách ở đầu dòng nên nó lúc nào cũng đứng trước nhé.
 
Upvote 0
Hèn chi em thấy từ mục 1->218 nó cứ cách mục 219-> 221 một khoảng trắng, mặc dù em đã canh trái.
Mục 1->218 là trích xuất từ phần mềm Foxpro ra và em đã chuyển mã, không biết tại sao lại có khoảng trắng,mà cột SL tồn không biết có phải là số không nữa. Mong các anh chị giúp loại bỏ khoảng trắng này.
 
Upvote 0
*** chi em thấy từ mục 1->218 nó cứ cách mục 219-> 221 một khoảng trắng, mặc dù em đã canh trái.
Mục 1->218 là trích xuất từ phần mềm Foxpro ra và em đã chuyển mã, không biết tại sao lại có khoảng trắng,mà cột SL tồn không biết có phải là số không nữa. Mong các anh chị giúp loại bỏ khoảng trắng này.
mình làm thủ công như vậy
Mã:
Sub botrong()
Dim lr As Long
lr = Sheet1.Range("B6500").End(3).Row
'MsgBox lr
With Sheet1
For i = lr To 4 Step -1
     .Range("B" & i) = Trim(.Range("B" & i))
     '.Range("D" & i) = CDbl(Trim(.Range("D" & i)))
Next i
End With
End Sub
 
Upvote 0
Nhờ các anh chị giúp em xem code này sao nó không chạy sort ạ:
Mã:
Private Sub Luu1_Click()
Dim i As Integer, irow As Long
    If ngay1 = "" Or spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation, "GPE": Exit Sub
    If ListBox1.ListCount = 0 Then MsgBox ("ban chua cap nhat Noi dung  vao Listbox"), vbExclamation, "GPE": Exit Sub

Application.ScreenUpdating = False 'giup code chay. nhanh hon
  With Sheet5
     irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
      For i = 0 To ListBox1.ListCount - 1
        .Cells(irow + i, 1) = irow + i - 3
        .Cells(irow + i, 2) = CDate(ngay1.Value)
        .Cells(irow + i, 2).NumberFormat = "m/d/yyyy"
        .Cells(irow + i, 3) = UCase(spn1.Value)
            .Cells(irow + i, 4) = ListBox1.List(i, 1)      'ten nhan cung cap
            .Cells(irow + i, 5) = ListBox1.List(i, 2)      'ten hang hoa
            .Cells(irow + i, 6) = ListBox1.List(i, 3)      'don vi tinh
            .Cells(irow + i, 7) = ListBox1.List(i, 4)      'so luong
            .Cells(irow + i, 8) = ListBox1.List(i, 5)      'ten theo KT
    Next
            .Cells(irow, 7).Resize(i).NumberFormat = "#,##0.00"
            .Cells(irow, 1).Resize(i, 8).Borders.LineStyle = 1
            .Cells(irow, 1).Resize(i, 8).Borders.ThemeColor = 5
          
    End With
    Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
ngay1 = "": spn1 = "": cb_NCC1 = "": cb_thh1 = "": dvt1 = "": sln1 = ""
ListBox1.Clear
Application.ScreenUpdating = True
ngay1.SetFocus
End Sub
chổ này sai chổ nào ạ:
Mã:
    Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
 
Lần chỉnh sửa cuối:
Upvote 0
Trong code trên em muốn khi dữ liệu lưu vào sheet5, thì Sort tăng dần bắt đầu từ CellB4 ạ, mong các anh chị chỉnh dùm code.
 
Upvote 0
...chổ này sai chổ nào ạ:
Mã:
    Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
Trong cả dòng, chỉ có i là một biến. Đặt code đưa nó ra xem là cái gì.
MsgBox i
Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
 
Upvote 0
Nhờ các anh chị giúp em xem code này sao nó không chạy sort ạ:
Mã:
Private Sub Luu1_Click()
Dim i As Integer, irow As Long
    If ngay1 = "" Or spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation, "GPE": Exit Sub
    If ListBox1.ListCount = 0 Then MsgBox ("ban chua cap nhat Noi dung  vao Listbox"), vbExclamation, "GPE": Exit Sub

Application.ScreenUpdating = False 'giup code chay. nhanh hon
  With Sheet5
     irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
      For i = 0 To ListBox1.ListCount - 1
        .Cells(irow + i, 1) = irow + i - 3
        .Cells(irow + i, 2) = CDate(ngay1.Value)
        .Cells(irow + i, 2).NumberFormat = "m/d/yyyy"
        .Cells(irow + i, 3) = UCase(spn1.Value)
            .Cells(irow + i, 4) = ListBox1.List(i, 1)      'ten nhan cung cap
            .Cells(irow + i, 5) = ListBox1.List(i, 2)      'ten hang hoa
            .Cells(irow + i, 6) = ListBox1.List(i, 3)      'don vi tinh
            .Cells(irow + i, 7) = ListBox1.List(i, 4)      'so luong
            .Cells(irow + i, 8) = ListBox1.List(i, 5)      'ten theo KT
    Next
            .Cells(irow, 7).Resize(i).NumberFormat = "#,##0.00"
            .Cells(irow, 1).Resize(i, 8).Borders.LineStyle = 1
            .Cells(irow, 1).Resize(i, 8).Borders.ThemeColor = 5
        
    End With
    Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
ngay1 = "": spn1 = "": cb_NCC1 = "": cb_thh1 = "": dvt1 = "": sln1 = ""
ListBox1.Clear
Application.ScreenUpdating = True
ngay1.SetFocus
End Sub
chổ này sai chổ nào ạ:
Mã:
    Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
Sai chổ nầy
.Cells(4, "B")
chỉnh
End With
Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
Thành

.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
End With
 
Upvote 0
Trong cả dòng, chỉ có i là một biến. Đặt code đưa nó ra xem là cái gì.
MsgBox i
Sheet5.Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
Theo VBA thì khi ra khỏi vòng lặp sẽ có i = ListBox1.ListCount.

Nhìn:

Sheet5.Range("B4:H4").Resize(i).Sort
= Sheet5.Range("B4:H4").Resize(ListBox1.ListCount).Sort

thì thấy code chỉ sắp xếp <số dòng dữ liệu thêm từ ListBox> dòng.

Nói nôm na thi nếu ListBox chỉ có 2 dòng dữ liệu thì code chỉ sắp xếp 2 dòng, bất luận trước khi thêm từ ListBox đã có hàng nghìn dòng dữ liệu hay không:

Sheet5.Range("B4:H4").Resize(i).Sort
= Sheet5.Range("B4:H4").Resize(2).Sort
= Sheet5.Range("B4:H5").Sort

Đấy là đánh giá sơ bộ để thấy cái vô lý của code. Bây giờ cần phải cân đo đong đếm thật chính xác.

Rõ ràng số dòng của vùng cần sắp xếp phụ thuộc vào 2 yếu tố. Số dòng cần sắp xếp phải là:

<số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> + <số dòng dữ liệu thêm từ ListBox>

Code mới chỉ lưu ý tới <số dòng dữ liệu thêm từ ListBox>. Còn thiếu <số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> dòng.

<số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> bằng bao nhiêu? Cái này quá dễ.

Chịu khó phân tích code. Bằng cách nào? Dùng cái đầu thôi.
 
Upvote 0
Em chỉnh theo anh Hiếu, mà code không Sort theo cột B, anh Hiếu ơi:
Mã:
Private Sub Luu1_Click()
Dim i As Integer, irow As Long
    If ngay1 = "" Or spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation, "GPE": Exit Sub
    If ListBox1.ListCount = 0 Then MsgBox ("ban chua cap nhat Noi dung  vao Listbox"), vbExclamation, "GPE": Exit Sub

Application.ScreenUpdating = False 'giup code chay. nhanh hon
  With Sheet5
     irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
      For i = 0 To ListBox1.ListCount - 1
        .Cells(irow + i, 1) = irow + i - 3
        .Cells(irow + i, 2) = CDate(ngay1.Value)
        .Cells(irow + i, 2).NumberFormat = "m/d/yyyy"
        .Cells(irow + i, 3) = UCase(spn1.Value)
            .Cells(irow + i, 4) = ListBox1.List(i, 1)      'ten nhan cung cap
            .Cells(irow + i, 5) = ListBox1.List(i, 2)      'ten hang hoa
            .Cells(irow + i, 6) = ListBox1.List(i, 3)      'don vi tinh
            .Cells(irow + i, 7) = ListBox1.List(i, 4)      'so luong
            .Cells(irow + i, 8) = ListBox1.List(i, 5)      'ten theo KT
    Next
            .Cells(irow, 7).Resize(i).NumberFormat = "#,##0.00"
            .Cells(irow, 1).Resize(i, 8).Borders.LineStyle = 1
            .Cells(irow, 1).Resize(i, 8).Borders.ThemeColor = 5
            .Range("B4:H4").Resize(i).Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
    End With 
ngay1 = "": spn1 = "": cb_NCC1 = "": cb_thh1 = "": dvt1 = "": sln1 = ""
ListBox1.Clear
Application.ScreenUpdating = True
ngay1.SetFocus
End Sub
Bài đã được tự động gộp:

Cám ơn Thầy @batman1, nhưng em "đầu to mà óc như trái nho", nên chổ này
"<số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> bằng bao nhiêu? Cái này quá dễ."
đối với em là không dễ ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Private Sub Luu1_Click()
Dim i As Integer, irow As Long
    If ngay1 = "" Or spn1 = "" Then MsgBox ("Ban chua nhap ngay hoac so phieu nhap"), vbExclamation, "GPE": Exit Sub
    If ListBox1.ListCount = 0 Then MsgBox ("ban chua cap nhat Noi dung  vao Listbox"), vbExclamation, "GPE": Exit Sub

Application.ScreenUpdating = False 'giup code chay. nhanh hon
  With Sheet5
     irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
      For i = 0 To ListBox1.ListCount - 1
        .Cells(irow + i, 1) = irow + i - 3
        .Cells(irow + i, 2) = CDate(ngay1.Value)
        .Cells(irow + i, 2).NumberFormat = "m/d/yyyy"
        .Cells(irow + i, 3) = UCase(spn1.Value)
            .Cells(irow + i, 4) = ListBox1.List(i, 1)      'ten nhan cung cap
            .Cells(irow + i, 5) = ListBox1.List(i, 2)      'ten hang hoa
            .Cells(irow + i, 6) = ListBox1.List(i, 3)      'don vi tinh
            .Cells(irow + i, 7) = ListBox1.List(i, 4)      'so luong
            .Cells(irow + i, 8) = ListBox1.List(i, 5)      'ten theo KT
    Next
            .Cells(irow, 7).Resize(i).NumberFormat = "#,##0.00"
            .Cells(irow, 1).Resize(i, 8).Borders.LineStyle = 1
            .Cells(irow, 1).Resize(i, 8).Borders.ThemeColor = 5
            irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
.Range("B4:H"&irow").Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
    End With
ngay1 = "": spn1 = "": cb_NCC1 = "": cb_thh1 = "": dvt1 = "": sln1 = ""
ListBox1.Clear
Application.ScreenUpdating = True
ngay1.SetFocus
End Sub
 
Upvote 0
Cám ơn anh Hiếu nhiều ạ.
 
Upvote 0
Cám ơn Thầy @batman1, nhưng em "đầu to mà óc như trái nho", nên chổ này
"<số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> bằng bao nhiêu? Cái này quá dễ."
đối với em là không dễ ạ.
1. Nếu cố tình dùng Range("B4:H4").Resize(...) thì

<số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> =?

Nhìn:
Mã:
irow = .Range("E65536").End(xlUp).Offset(1).Row
thì irow là dòng trống đầu tiên trước khi thêm từ ListBox. Vậy (irow-1) là dòng cuối cùng có dữ liệu trước khi thêm từ ListBox. Vậy thì từ dòng 4 tới dòng (irow-1) có tất cả bao dòng? Hỏi đứa con lớp 1 nó sẽ nói: "Êêê, phép trừ đơn giản. Đó là (irow-1) - 3 (từ dòng 1 tới dòng (irow-1) bỏ đi 3 dòng đầu)"

Vây:
<số dòng có dữ liệu kể từ dòng 4 trước khi thêm dữ liệu từ ListBox> = irow-4
Có
<số dòng dữ liệu thêm từ ListBox> = ListBox1.ListCount

Tổng số dòng cần sắp xếp là irow - 4 + ListBox1.ListCount

Tức
Mã:
.Range("B4:H4").Resize(irow - 4 + ListBox1.ListCount).Sort ...

Khỏi phải dùng
Mã:
irow = .Range("E65536").End(xlUp).Offset(1).Row
sau vòng FOR

Thậm chí nếu dùng
Mã:
.Range("B4:H4").Resize(irow - 4 + ListBox1.ListCount).Sort ...
thì bắt buộc phải bỏ
Mã:
irow = .Range("E65536").End(xlUp).Offset(1).Row

sau vòng FOR

Óc quả nho hay ổi hay quả dừa thì cứ nhìn lên trang tính rồi dùng cộng trừ lớp 1 là ra thôi.

Sửa code, tung code có sẵn không khó. Hướng dẫn tư duy để lần sau bạn tự làm mới là cần thiết. Cho cần câu thôi chứ lúc lúc lại cho con cá không phải là cách tốt. Vấn đề nhỏ như con thỏ mà lần nào cũng hỏi?
 
Lần chỉnh sửa cuối:
Upvote 0
Sao em thử code của anh Hiếu không được vậy, nó báo lỗi "1004", mà irow đã khai báo ở trên rồi sao còn khai báo tiếp vậy anh?
Bài đã được tự động gộp:

Code của anh Hiếu thì lỗi
Mã:
 irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
.Range("B4:H"&irow").Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
    End With
Code của Thầy batman1 thì được:
Mã:
            .Range("B4:H4").Resize(irow - 4 + ListBox1.ListCount).Sort key1:=.Cells(4, "B"), order1:=xlAscending, _
              Header:=xlNo, Orientation:=xlTopToBottom
            End With
 
Lần chỉnh sửa cuối:
Upvote 0
Sao em thử code của anh Hiếu không được vậy, nó báo lỗi "1004", mà irow đã khai báo ở trên rồi sao còn khai báo tiếp vậy anh?
Bài đã được tự động gộp:

Code của anh Hiếu thì lỗi
Mã:
 irow = .Range("E65536").End(xlUp).Offset(1).Row 'xac dinh row cuoi cung` chua' du~ lieu
.Range("B4:H"&irow").Sort key1:=.Cells(4, "B"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
    End With
Bỏ: .Offset(1)
irow = .Range("E65536").End(xlUp).Row 'xac dinh row cuoi cung` chua' du~ lieu
 
Upvote 0
Sao em thử code của anh Hiếu không được vậy, nó báo lỗi "1004", mà irow đã khai báo ở trên rồi sao còn khai báo tiếp vậy anh?

Code của anh Hiếu thì lỗi
irow trước FOR là xác định dòng trống đầu tiên (không phải là dòng cuoi cung` chua' du~ lieu như chú thích ghi) trước khi thêm từ ListBox.

irow sau FOR là xác định dòng trống đầu tiên (không phải là dòng cuoi cung` chua' du~ lieu như chú thích ghi) sau khi thêm từ ListBox.

Suy nghĩ chút đi.


Không phải .Range("B4:H"&irow")

mà là .Range("B4:H"&irow)

Người ta gõ theo phản xạ thôi. Nhưng đọc thì cần suy nghĩ chút.
 
Upvote 0
Thì từ căn bản mà em không biết thì em biết chổ nào sai,ngay cả cách đặt biến mà em cón chưa biết thì làm sao em biết irow trước For và sau For là cái gì, ngay cả dấu """ trong
.Range("B4:H"&irow")
em còn chưa biết thì làm sao em biết irow trước FOR và sau FOR, mong thầy batman1 thông cảm. (em cũng đã nhờ Thầy rất nhiều, Thầy biết mà)
 
Upvote 0
Hihi vài năm nữa là bạn tu luyện được bí kíp
Cố gắng lên :victory:
 
Upvote 0
Có phải anh @Huyyeu99999@thuyyeu99, nếu là thực thì em xin bái phục, vì anh quá giỏi trong code VBA lẫn Delphi, em thì chắc 20 năm nữa vẫn "mù VBA" là "mù VBA".
 
Upvote 0
Web KT
Back
Top Bottom