Adin để phân loại gỗ theo quy cách

Liên hệ QC

phochiadoi

Thành viên mới
Tham gia
24/9/06
Bài viết
10
Được thích
0
Add-Ins để phân loại gỗ theo quy cách

Một danh sách 3 cột: Dày, Rộng, Dài với hàng trăm mẫu tin trùng nhau.
Có cách nào trích xuất ra từng loại và số thanh của mỗi loại không?
Ví dụ:
Dày___ Rộng___Dài____Số Tấm_________Khối Lượng
0.03___0.35____3.5_____30________= dài * rộng * dài * số tấm
0.03___0.35____4.0____133_______ = dài * rộng * dài * st
0.04___0.45____3.0_____27________= dài * rộng * dài * số tấm
.... ...... ..... ...... .......................................

Tôi vào Excel, tạo 1 tài liệu mới
Vào Tool > Macro > Visual Basic Editor
Insert Module 1 với đoạn code sau:

Function phanloai(rng As Range, day As Double, rong As Double, dai As Double) As Integer
'khai bao cac bien can dung
Dim count As Integer
Dim i As Integer
'khoi dong so luong ban dau
count = 0
'duyet xu ly tung tam go
For i = 1 To rng.count
'Kiem tra cac dieu kien thoa man
If (day = CDbl(rng.Item(i, 1))) And (rong = CDbl(rng.Item(i, 2))) And (dai = CDbl(rng.Item(i, 3))) Then
'tim thoa thi tang so luong dem
count = count + 1
End If
'tra ve so luong dem duoc
phanloai = count
Next i
End Function

Rồi quay lại cửa sổ Excel
vào File > Save As... và lưu với tên file là Quycach.xla vào thư mục Add-Ins của Microsoft Office
Đóng Excel lại và mở lại Excel.
Sau đó vào Tool > Add-Ins... và đánh check vào mục Quycach.
Nhưng khi dùng hàm ở danh sách:
= phanloai(a1:c20;0.03;0.35;3.5)
thì kết quả là : #NAME?

Sau đó tôi vào xoá Module 1 và copy đoạn code trên vào ThisWorkbook thì kết quả vẫn như vậy.

Hàm này chỉ dùng được khi tôi lưu nó ở dạng Module trong từng file riêng lẻ của Excel. Cách này hơi mất công vì tôi thường xuyên phải thống kê hàng trăm khối gỗ theo quy cách. Đồng thời (hình như) Module làm việc rất nặng nề với hàng trăm mẫu tin, mỗi lần chỉnh sửa những cell liên quan đến hàm là mất trên dưới 1 phút. Hơn nữa cũng không tự động trích xuất được những loại quy cách có mặt trong danh sách.

Có lẽ vì tôi không biết cách tạo một Add-Ins thì phải.
Xin mọi người chỉ giúp cách trích xuất một cách tự động các mẫu tin và số lượng của mỗi loại bằng adin. (Đặt biệt là các thao tác để tạo một adin, cũng như thành phần của một Add-Ins)
Lần đầu tiên phát hiện ra một nơi lý thú như thế này (Giải Pháp Excel) và cũng là lần đầu mày mò cách viết một hàm trong Excel nên còn lớ ngớ.
Mong mọi người chỉ bảo thêm.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đối với công thức mảng, bạn dùng For Each, thay vì for ở dưới đây

'duyet xu ly tung tam go
For i = 1 To rng.count

Tối nhất là bạn tải file lên diễn đàn thì mọi người hiểu cặn kẽ hơn.
 
Lần chỉnh sửa cuối:
Cách 1:
Function phanloai_new(Rng As Range, day As Double, rong As Double, dai As Double) As Integer
'khai bao cac bien can dung
Dim count_1 As Integer
Dim i As Integer
'khoi dong so luong ban dau
count_1 = 0
'duyet xu ly tung tam go
For i = 1 To Rng.Rows.count
'Kiem tra cac dieu kien thoa man
If (day = CDbl(Rng.Cells(i, 1))) And (rong = CDbl(Rng.Cells(i, 2))) And (dai = CDbl(Rng.Cells(i, 3))) Then
'tim thoa thi tang so luong dem
count_1 = count_1 + 1
End If
Next i
'tra ve so luong dem duoc
phanloai_new = count_1
End Function

Cách 2:
Bạn có thể dùng thêm các khác là lọc theo điều kiện (nhấn Data/Filter/Advanced Filter...)
Cần chú ý điều kiện lọc.
 
Lần chỉnh sửa cuối:
Hàm như bạn nvson viết là ổn. Nhưng theo tôi, không cần thiết sử dụng hàm CDbl vì bị thừa, code khi đó sẽ rối hơn.

Cám ơn bạn nvson đã nhiệt tình chỉ bảo.
 
Rất cám ơn mọi người đã chỉ bảo tận tình như vậy. Nhưng vấn đề chính của Diễm vẫn là trích xuất từng loại quy cách... Diễm up lên file QuyCachGo để mọi người có thể nghiên cứu giúp.
Ở đây có hàng trăm loại quy cách, như vậy liệu có thể tạo mảng hàng trăm phần tử để lưu được không? Có nặng lắm không? Nếu được, có thể chỉ cho Diễm chi tiết hơn được không? -\\/.
 

File đính kèm

  • quicachgo.zip
    29.5 KB · Đọc: 84
Lần chỉnh sửa cuối:
Cứ từ từ sẽ xong thôi!

1./ File của bạn có con Virus to đùng; lần sau nhớ diệt đi mới cho lên mạng nha! Nếu không mang tội phát tán bệnh tật đó!
2/
Để xóa các Record trùng ta trình tự tiến hành như sau:
a* Xếp theo một trật tư (cũng = VBA luôn nha!)
b* Khai chỉ 1 biến mảng để chứa 1 record mà thôi
c* Duyệt theo từng record; nếu trùng thì xóa nó đi thôi
(Chuyện này máy làm chỉ trong fút là xong)
Bạn bỏ bớt chỉ để lại 99 Recod tiêu biểu thôi, để mọi người giúp cho!
 
Chào phochiadoi!
Do đề bài bạn nói không rõ thôi.
Bạn chọn vùng dữ liệu rồi chạy Macro này. (nhấn Alt+F8)

Option Explicit
Public Sub Delete_Record()
Dim rngData As Range
Dim i As Integer, j As Integer
ActiveSheet.Copy Before:=ActiveSheet
Set rngData = Selection
For i = 1 To rngData.Rows.Count - 1
For j = i + 1 To rngData.Rows.Count
If rngData.Cells(j, 1) = rngData.Cells(i, 1) And rngData.Cells(j, 2) = rngData.Cells(i, 2) And rngData.Cells(j, 3) = rngData.Cells(i, 3) Then
rngData.Cells(j, 1) = ""
rngData.Cells(j, 2) = ""
rngData.Cells(j, 3) = ""

'Range(rngData.Cells(j, 1), rngData.Cells(j, 3)).Select
'Selection.Delete Shift:=xlUp
End If
Next j
Next i
Selection.Sort Key1:=Range(Selection.Cells(1, 1).Address), Order1:=xlAscending, _
Key2:=Range(Selection.Cells(1, 2).Address), Order2:=xlAscending, _
Key3:=Range(Selection.Cells(1, 3).Address), Order3:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
End Sub
 
Lần chỉnh sửa cuối:
To: SA_DQ
Híc... Thì ra đó là Virus, Diễm cũng ngờ ngợ... nhưng lại nghĩ chắc do Excel sinh ra khi chạy các đoạn code.(Lần đầu viết code mà, cứ tưởng nó sinh ra các file khi dịch chương trình như Pascal,C++... chứ). May mà bác nói mới biết. Cám ơn bác nhiều nha.
Cách bác chỉ thì Diễm hiểu hết vì từng học qua thuật toán (tin học)... Vấn đề là Diễm không rành lập trình trong Excel nên không biết cách thực hiện các thao tác này như thế nào. Nhưng được bác và mọi người quan tâm như dậy là mừng lắm rồi.@$@!^%
To: nvson
Đoạn code trước của bác chạy rất ổn (Diễm làm không bằng 1 góc, chạy lúc được lúc không), nên Diễm tin là đoạn code này cũng vậy. Nhưng dù sao Diễm cũng về test lại và báo cáo lại cho mấy bác mừng. Cám ơn bác nhiều nha.-0-/. -\\/. Không chỉ tiết kiệm được thời gian mà Diễm còn được học hỏi nhiều nữa. Rất may mắn khi Diễm phát hiện và được tham gia vào diễn đàn.
 
Mình đã Test thử, với phần dữ liệu của bạn, mình chạy hết 1.5 phút là xong. Nếu Diễm muốn chạy nhanh hơn nên copy dữ liệu (chỉ phần dữ liệu thôi) sang một file khác và mỗi lần chạy chia nhỏ số hàng ra để chạy nhiều lần sẽ nhanh hơn.
 
Vâng, nhưng có một phần đoạn code Diễm không hiểu. Đó là những dòng tô đỏ :
nvson đã viết:
Option Explicit
Public Sub Delete_Record()
Dim rngData As Range
Dim i As Integer, j As Integer
ActiveSheet.Copy Before:=ActiveSheet
Set rngData = Selection
For i = 1 To rngData.Rows.Count - 1
For j = i + 1 To rngData.Rows.Count
If rngData.Cells(j, 1) = rngData.Cells(i, 1) And rngData.Cells(j, 2) = rngData.Cells(i, 2) And rngData.Cells(j, 3) = rngData.Cells(i, 3) Then
rngData.Cells(j, 1) = ""
rngData.Cells(j, 2) = ""
rngData.Cells(j, 3) = ""

'Range(rngData.Cells(j, 1), rngData.Cells(j, 3)).Select
'Selection.Delete Shift:=xlUp
End If
Next j
Next i
Selection.Sort Key1:=Range(Selection.Cells(1, 1).Address), Order1:=xlAscending, _
Key2:=Range(Selection.Cells(1, 2).Address), Order2:=xlAscending, _
Key3:=Range(Selection.Cells(1, 3).Address), Order3:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
End Sub
Bác (không biết xưng hô sao cho tiện) có thể giải thích giúp được không? Bản chất của những dòng này là gì vậy? ;;;;;;;;;;; Coi như là bác dạy Diễm cách câu cá còn hơn là cho Diễm vài con cá mà bác câu được... Phải không bác?-=.,,
 
'Range(rngData.Cells(j, 1), rngData.Cells(j, 3)).Select
'Selection.Delete Shift:=xlUp


Hai dòng trên là mình định xoá luôn các dòng bị trùng, nhưng nếu làm như vậy thì chương trình sẽ chạy chậm đi rất nhiều nên mình đặt giá trị của các ô đó bằng ký tự "". Mình viết vào đó để bạn tham khảo và có thể thay đổi theo ý riêng của bạn.

Selection.Sort Key1:=Range(Selection.Cells(1, 1).Address), Order1:=xlAscending, _
Key2:=Range(Selection.Cells(1, 2).Address), Order2:=xlAscending, _
Key3:=Range(Selection.Cells(1, 3).Address), Order3:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:=xlSortNormal
Những dòng trên là sắp xếp vùng lựa chọn (tương tự như khi bạn vào Data/Sort).
 
Chào Bạn Diễm. Bên mình cũng làm bên ngành gỗ, nhưng mình thấy cách phân loại và làm như bên bạn thì thực tình là hơi bị tốn công, không biết mình nói đúng không hay đó là cách quản lý của bên bạn. Thực tình việc phân loại theo qui cách như vậy có cách khác. Nếu được bạn có thể liên hệ theo địa chỉ mình quanghuongho@yahoo.com để có thể trao đổi nhiều hơn về cách làm.
 
Bão ở Đà Nẵng lớn quá, mấy hôm nay không có thời gian để online nữa. Hôm nay bị đau mắt nên mới được nghỉ ở nhà. Nếu có hồi âm trễ, mong mọi người thông cảm nha.

Chào yêu đời!

Diễm nghĩ đây là Post "Phân loại qui cách gỗ" nên mình có thể trao đổi thoải mái về cách phân loại ở đây, đúng không? Tiện thể mọi người có thể cùng nghiên cứu, học hỏi và giúp đỡ nhau. Đây là nick yahoo của mình : dep_1_chiec ; mail dep_1_chiec@yahoo.com . Bằng cách này hay cách khác, mình luôn mong muốn được trao đổi học hỏi với bạn. Rất vui vì gặp được một người cùng chuyên môn.

Công việc phân loại như vậy thật mất công, nhưng khi nhận hàng, khách hàng thường yêu cầu Fax cho họ bảng phân loại như vậy để tiện việc kiểm kê.

Nếu có cách phân loại khác hay cách quản lý khác hay hơn, bạn chỉ cho mình với.
 
To Yêu đời
File trước bị virus nên Diễm up file này lên để bạn nghiên cứu giúp.-\\/. Cám ơn nhiều!
 

File đính kèm

  • quicachgo.zip
    29.5 KB · Đọc: 65
Lần chỉnh sửa cuối:
Nếu bạn ở DN thì cùng tỉnh trước đây với mình rồi, mình ở Hội An để mình xem lại file rồi sẽ trả lời chi tiết cho bạn.
 
Vâng, bạn có thể mô tả về cách quản lý ở công ty của bạn được không? Diễm có đọc qua những bài bạn post, có vẻ như hoạt động của công ty bạn cũng như của mình thì phải. Chúng ta có thể trao đổi nhiều hơn về cách quản lý được không?
 
Uh thứ 1 việc nghiệm thu ( Mình dùng theo từ gọi là chuyên môn) của bạn để đưa vào lý lịch gỗ là quá dài vì vậy khi tập hợp lại số tấm ( Thanh) làm cho bạn thấy khó khăn. Nếu có thể bạn hãy nghiệm thu và ghi thẳng số tấm vào trong lý lịch. Ví dụ
Dày: 25
rộng:
150: 2 ;250:3;230:4 bạn có thể dùng dấu I để thay cho số.
Thứ 2: nếu làm theo cách của bạn mình nghĩ có thể dùng công thức của excel để đếm được chứ không cần dùng công thức tự tạo.
Nếu có thể mình sẽ gửi cho bạn một file để lên lý lịch và biên bản nghiệm thu của bên mình để bạn tham khảo.Ah công ty bạn có phải ở Phường Thanh Lộc Đán Q. Thanh Khê không.
 
Vâng, mình vẫn dùng cách nghiệm thu như bạn nói đối với gỗ trước khi đưa vào lò sấy. Nếu khách hàng mua gỗ đã xấy rồi thì rất đơn giản.

Nhưng đối với gỗ xẻ vừa mới được xẻ ra từ gỗ tròn, thì chỉ có độ dày là đồng bộ, còn dài và rộng khác nhau. Khi khách hàng nghiệm thu từ những thanh gỗ này thì bạn chỉ có thể đếm số thanh theo dộ dày của nó chứ không thể đếm theo dày + rộng + dài. Nhưng yêu cầu của khách hàng thì lúc nào cũng là phân loại theo dày + rộng + dài. Công việc này mà đếm bằng tay với hàng nghìn thanh gỗ thì ... khác gì tra tấn :wallbash:. Công việc nghiệm thu rất nhiều nên phải tiến hành nhanh chóng, không ai vừa nghiệm thu vừa chờ bạn đếm cả.

Vâng, công ty mình có 1 phân xưởng ở Thanh Lộc Đán. Đó là một trong những phân xưởng của công ty. Mình làm việc ở một phân xưởng khác ở Duy Xuyên, qui mô hơn và hoạt động rộng hơn. Không biết hoạt động của công ty bạn bên lĩnh vực nào, gỗ xấy, gỗ xẻ hay xuất khẩu, tinh chế...?

Bạn có thể gửi cho mình lý lịch và biên bản nghiệm thu bên bạn để mình tham khảo được không? Mình luôn mong muốn có thể làm công việc này đơn giản hơn và tiết kiệm bớt thời gian. Cám ơn bạn vì đã quan tâm!
 
nvson đã viết:
Cách 1:
Cách 2:
Bạn có thể dùng thêm các khác là lọc theo điều kiện (nhấn a/Filter/Advanced Filter...) Cần chú ý điều kiện lọc.

Cách ba: Xóa record trùng từ dưới lên:
Mình tạo ra bảng thóng kê lỗi trước, tại Sheets 'S4' :
Mã:
 Dim iZ As Long, iTiep As Long, iKTh As Long
 Dim StrC As String, Schu As String
[B]Sub Macro3()[/B]
    Sheets("S4").Select:  iKTh = 65535
    CreateError
[B]End Sub[/B]
Mã:
[B]Sub CreateError(Optional Chu0 As String)[/B]
 Application.ScreenUpdating = False
 If IsMissing(Chu0) Or Len(Chu0) < 1 Then Chu0 = "E"
 For iZ = 2 To iKTh
    StrC = Chu0 & CStr(iZ):          Range(StrC).Select
    With Selection
        .Offset(0, -1).Value = iZ - 1
        .Value = Error$(iZ - 1)
    End With
 Next iZ
[B]End Sub[/b]
Mã:
[b]
Sub XoaTrung()[/B]
 Dim iCuoi As Long, iBDau As Long, iXoa As Long
 Application.ScreenUpdating = False
 
 Sheets("S4").Select:    Schu = ""
 iCuoi = Range("E65536").End(xlUp).Row
 For iZ = iCuoi To 2 Step -1
 
    StrC = "E" & CStr(iZ):          Range(StrC).Select
    With Selection
        If .Value <> Schu Then
            Schu = .Value
            If iXoa > 0 Then
                Range("D" & CStr(.Row + 2) & ":E" & CStr(iBDau)).Delete Shift:=xlUp
                iXoa = 0
            Else
                iBDau = .Row
            End If
            
        Else
            iXoa = iXoa + 1
            
        End If
    End With
 Next iZ 
[B]End Sub[/B]
 
Lần chỉnh sửa cuối:
Uh mình biết công ty của bạn rùi. Chỗ Ông Xuân phải không. Công ty mình là Forexco Quang Nam nhưng mình làm ở xí nghiệp mộc Việt Đức. Ý mình không phải như bạn nghĩ đâu. Đó là khi nghiệm thu ta ghi luôn số tấm theo qui cách từng loại theo bề dày, dài và theo chiều rộng luôn chứ ai lại đi đếm. Công ty mình chuyên làm hàng mộc xuất khẩu.
 
Web KT
Back
Top Bottom