Code rải số thứ tự bị sai

Liên hệ QC

NguyenthiH

Thành viên mới đăng ký
Tham gia
11/12/16
Bài viết
940
Được thích
171
Giới tính
Nữ
Em có đoạn code nhập tên hàng hóa
Mã:
Private Sub nhm7_Click()
Dim Arr(), lastRow As Long, k As Long, dic As Object
If Trim(thh7.Value) = "" Then
        MsgBox ("Hay nhap ten hang hoa"), , "GPE"
        thh7.SetFocus
    ElseIf Trim(dvt7.Value) = "" Then
        MsgBox ("Hay nhap don vi tinh"), , "GPE"
        dvt7.SetFocus
    Else
        Set dic = CreateObject("Scripting.Dictionary")
        lastRow = Sheet1.Range("A65536").End(xlUp).Row
        Arr = Sheet1.Range("A3:D" & lastRow).Value
        For k = 1 To UBound(Arr)
            If Not dic.exists(LCase(Arr(k, 1))) Then dic.Add LCase(Arr(k, 1)), ""
        Next
        If dic.exists(LCase(Trim(thh7.Value))) Then
            MsgBox ("Ten hang trung, hay nhap lai"), , "GPE"
            thh7.SetFocus
        Else
            Sheet1.Range("A" & lastRow + 1).Value = k
            Sheet1.Range("B" & lastRow + 1).Value = Application.Proper(Trim(thh7.Value))
            Sheet1.Range("C" & lastRow + 1).Value = UCase(Left(Trim(dvt7.Value), 1)) & LCase(Mid(Trim(dvt7.Value), 2))
            Sheet1.Range("D" & lastRow + 1).Value = 0
        thh7 = Empty
        dvt7 = Empty
        thh7.SetFocus
            MsgBox ("Da nhap xong hang moi"), , "GPE"
        End If
        Set dic = Nothing
    End If
End Sub
trongđó đoạn:
Mã:
Sheet1.Range("A" & lastRow + 1).Value = k
để rãi số thứ tự ở cột A, nhưng lại bị sai, ví dụ em đã có số thứ tự đến 20 rồi, nhưng khi nhập tên hàng hóa mới thì rãi số thứ tự lại là 22 đúng ra phải là 21.
Mong các anh chị giúp chỉnh code lại cho đúng ạ.
 
Em có đoạn code nhập tên hàng hóa
Mã:
Private Sub nhm7_Click()
Dim Arr(), lastRow As Long, k As Long, dic As Object
If Trim(thh7.Value) = "" Then
        MsgBox ("Hay nhap ten hang hoa"), , "GPE"
        thh7.SetFocus
    ElseIf Trim(dvt7.Value) = "" Then
        MsgBox ("Hay nhap don vi tinh"), , "GPE"
        dvt7.SetFocus
    Else
        Set dic = CreateObject("Scripting.Dictionary")
        lastRow = Sheet1.Range("A65536").End(xlUp).Row
        Arr = Sheet1.Range("A3:D" & lastRow).Value
        For k = 1 To UBound(Arr)
            If Not dic.exists(LCase(Arr(k, 1))) Then dic.Add LCase(Arr(k, 1)), ""
        Next
        If dic.exists(LCase(Trim(thh7.Value))) Then
            MsgBox ("Ten hang trung, hay nhap lai"), , "GPE"
            thh7.SetFocus
        Else
            Sheet1.Range("A" & lastRow + 1).Value = k
            Sheet1.Range("B" & lastRow + 1).Value = Application.Proper(Trim(thh7.Value))
            Sheet1.Range("C" & lastRow + 1).Value = UCase(Left(Trim(dvt7.Value), 1)) & LCase(Mid(Trim(dvt7.Value), 2))
            Sheet1.Range("D" & lastRow + 1).Value = 0
        thh7 = Empty
        dvt7 = Empty
        thh7.SetFocus
            MsgBox ("Da nhap xong hang moi"), , "GPE"
        End If
        Set dic = Nothing
    End If
End Sub
trongđó đoạn:
Mã:
Sheet1.Range("A" & lastRow + 1).Value = k
để rãi số thứ tự ở cột A, nhưng lại bị sai, ví dụ em đã có số thứ tự đến 20 rồi, nhưng khi nhập tên hàng hóa mới thì rãi số thứ tự lại là 22 đúng ra phải là 21.
Mong các anh chị giúp chỉnh code lại cho đúng ạ.
Vậy dùng.
Mã:
Sheet1.Range("A" & lastRow + 1).Value = k-1
 
Upvote 0
Cám ơn anh @giaiphap, thế đoạn code này:
Mã:
Sheet1.Range("D" & lastRow + 1).Value = 0
em muốn khi đập vào cột D có giá trị là "0.00" thì chỉnh sao anh? (dạng số = 0)
 
Upvote 0
Upvote 0
Anh @giaiphap ơi, code nhập hàng hóa trên,mong anh chỉnh cho khi nhập xong hàng hóa mới thì kẻ Border từ cột A-> cột E luôn ạ.
 
Upvote 0
Dạ file đây ạ.
 

File đính kèm

  • Book1.xlsb
    19.9 KB · Đọc: 10
Upvote 0
Thêm lệnh sau:
Mã:
            With Sheet1.Range("A" & lastRow + 1).Resize(, 5).Borders
                .LineStyle = xlContinuous
                .ThemeColor = 5
                .TintAndShade = -0.249946592608417
            End With
Vào phía dưới câu lệnh.
Mã:
Sheet1.Range("E" & lastRow + 1).Value = thhKT.Value
 
Upvote 0
Code này đọc hiểu chết liền.
1. nhiệm vụ của cái dictionary là chỉ để dò 1 trị? dùng hàm Match hoặc Find có phảin hữu hiệu hơn không?
2. muốn lấy số thứ tự kế tiếp để dùng thì đọc số trước (hoặc dùng hàm max) chứ đâu lại đếm theo số dòng.
 
Upvote 0
Anh @giaiphap ơi, code nhập hàng hóa trên,mong anh chỉnh cho khi nhập xong hàng hóa mới thì kẻ Border từ cột A-> cột E luôn ạ.
Sao bạn khg ghi macro cho việc địn
Anh @giaiphap ơi, code nhập hàng hóa trên,mong anh chỉnh cho khi nhập xong hàng hóa mới thì kẻ Border từ cột A-> cột E luôn ạ.
Cái này ghi macro chắc cũng ra mà
 
Upvote 0
Không bàn tới hiệu xuất vì nhanh chậm một chút cũng chả sao. Nhưng code chắc chắn không đúng ý người dùng.

Không cần nhìn tập tin mà chỉ nhìn
Mã:
Sheet1.Range("A" & lastRow + 1).Value = k
Sheet1.Range("B" & lastRow + 1).Value = Application.Proper(Trim(thh7.Value))
thì thấy cột A là STT, cột B là Tên Hàng Hóa.

Nhìn
Mã:
Arr = Sheet1.Range("A3:D" & lastRow).Value
thì thấy mảng Arr lấy từ 4 cột A, B, C và D.
Nhìn
Mã:
For k = 1 To UBound(Arr)
            If Not dic.exists(LCase(Arr(k, 1))) Then dic.Add LCase(Arr(k, 1)), ""
Next
thì thấy điều kiện luôn thoả, và các STT (Arr(k, 1) là các STT do được lấy từ cột A) được thêm vào đít thon. Do vậy điều kiện dic.exists(LCase(Trim(thh7.Value))) luôn là FALSE - trong đít thon là các STT mà thh7.Value là tên hàng hóa, và các dữ liệu được thêm vào sheet1, thậm chí cả khi thh7.Value đã tồn tại trên sheet1 - trái với dụng ý của người dùng là chỉ thêm Tên Hàng Hóa chưa có.

Tất nhiên phải sửa thành
Mã:
Arr = Sheet1.Range("B3:D" & lastRow).Value

Nhưng nhìn code thì thực ra chỉ cần tới cột Tên Hàng Hóa - cột B, vì code chỉ dùng 1 cột của mảng Arr. Vậy nhập vào Arr 1 cột - cột B thôi. Nhập 3, 4 cột để làm gì?
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu mình đoán không nhầm thì tác giả bài đăng đang cần nhập mới hàng hóa vô 1 bảng danh mục (có sẵn)
(như hình dưới

DANH MỤC HÀNG HÓA
STTTên Hàng HóaĐVTTồnTên gọi khác
1​
Áo Thun Cá SấuPcs
550.00​
Áo thun
2​
Băng Keo 2 mặt 2CmCuộn
35.00​
Băng keo 2 mặt
3​
Băng Keo ĐỏCuộn
-12.00​
Băng keo 2 mặt
4​
Băng Keo GiấyCuộn
0.00​
Băng keo giấy
5​
Băng Keo trong 1.2CmCuộn
72.00​
Băng keo trong
6​
Băng Keo trong 2.4CmCuộn
6.00​
Băng keo trong
7​
Băng Keo trong 4.8CmCuộn
269.00​
Băng keo trong 4,8cm
8​
Băng Keo trong 7CmCuộn
16.00​
Băng keo trong 4,8cm
9​
Băng Keo VàngCuộn
0.00​
Băng keo vàng
10​
Băng Keo XanhCuộn
0.00​
Băng keo xanh


Trong quá trình nhiều năm vận hành, kho hay danh mục HH cũng sẽ phải có kiểm kê; Khi ý 1 số mặt hàng sẽ không còn tồn tại (& mãi sẽ không tồn tại trong kho cũa ta nữa) Có nghĩa là những dòng dữ liệu nào đó ta nên xóa khỏi danh mục.

Nếu vậy thì chuyện đánh số TT cho mặt hàng mới, cần thiết là phải tìm ra STT lớn nhất hiện có trong DS & tăng nó lên 1 đơn vị cho mặt hàng mới (định nhập) này.

Những góp ý ngoài lề về thiết kế file (mà chủ bài đăng đã đưa lên):
(1) Theo thứ tự từ trái qua phải thì HH luôn có 'tên gọi khác' hiếm khi biến đổi; Còn (số lượng) 'Tồn' thì biến đổi theo tiến trình kiểm kê;
Từ đó khuyên bạn nên đổi vị trí cho nhau giữa 2 cột này

(2) HH trong kho nên có mã duy nhất cho từng mặt hàng;

(3) Nếu là mình thì mình sẽ thêm cột 'Tính chất' (HH) tách bớt ra từ cột 'Tên HH';Có nghĩa là
[STT], [Mã HH], [Tên HH](, [Tên khác]), [DVT], [Đăc tính], [Tồn]
. . . . . . .
Chúc mọi người có tuần làm việc đầy hiệu quả!
 
Upvote 0
Dạ đúng như Bác SA_DQ nói ạ, là em nhập vào danh mục hàng hóa có sẵn, những hàng hóa nào có từ trước là có SL tồn, còn hàng hóa nào mới nhập thì có SL tồn là không(0), và danh mục hàng năm sẽ tăng lên theo thời gian, có những danh mục 2-3 năm không có xài, nhưng tới 5 năm sau lại có, nên em sẽ không xóa danh mục này. Cột tên khác là để khi in ra người khác coi, người đó biết mình gọi là tên gì, và có thể tổng hợp báo cáo theo tên gọi khác luôn ạ. Các phần này em đã được anh Hiếu giúp em rồi ạ. Em cám ơn các anh chị rất nhiều.
 
Upvote 0
Tôi nói nhiều lần rồi nó thành như cái dĩa hát cũ (*)
Đưa code lên mà không nói rõ code làm cái gì thì mò đỏ con mắt.
Cái nguyên tắc muôn thuở mà mọi người cố tình quên: đọc code mà không rõ nó muốn làm gì thì làm sao biết là thuật toán sai hay code sai thuật toán?

Quy trình, chưa nói đến thuật toán, của code này hết sức là a-ma-tơ.
Điển hình, nhập xong, xoá dữ liệu trên Form rồi mới báo cho người ta biết đã nhập.
Nếu báo bằng msgbox thì đáng lẽ báo xong rồi mới xoá chứ!
Chỉ trường hợp báo bằng label ("đã nhập xong món hàng xxxx. Xin mời nhập món kế tiếp") và sẵn sàng focus vào món kế tiếp thì mới xoá trước.
 
Upvote 0
Web KT
Back
Top Bottom