Code Sort không chạy

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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.
 

chisinhvnn

Thành viên tiêu biểu
Tham gia ngày
7 Tháng ba 2008
Bài viết
411
Được thích
90
Điểm
695
*** 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
 

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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:

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
9,956
Được thích
11,984
Điểm
1,560
...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
 

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
7,133
Được thích
14,039
Điểm
1,860
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
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,440
Được thích
5,189
Điểm
560
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.
 

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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:

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
7,133
Được thích
14,039
Điểm
1,860
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
 

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
Cám ơn anh Hiếu nhiều ạ.
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,440
Được thích
5,189
Điểm
560
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:

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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:

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
7,133
Được thích
14,039
Điểm
1,860
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
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,440
Được thích
5,189
Điểm
560
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.
 

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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à)
 

Huyyeu99999

Thành viên chính thức
Tham gia ngày
27 Tháng mười hai 2019
Bài viết
53
Được thích
25
Điểm
20
Hihi vài năm nữa là bạn tu luyện được bí kíp
Cố gắng lên :victory:
 

NguyenthiH

thành viên mù VBA
Tham gia ngày
11 Tháng mười hai 2016
Bài viết
811
Được thích
126
Điểm
220
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".
 
Top Bottom