Nhờ giúp code VBA bảng tính bóc tách khối lượng trong xây dựng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vuongdanhthang

Thành viên mới
Tham gia
1/8/13
Bài viết
12
Được thích
2
Chào các anh chị,

Em đang làm bên xây dựng, làm công việc bóc tách khối lượng thường xuyên.
Em muốn có một bảng tính mẫu sử dụng VBA để làm cho thao tác bóc tách khối lượng nhanh hơn. Lần mò trên diễn đàn thấy một file excel có code VBA của anh Lưu Trung Kiên viết về bảng thống kê thép; em áp dụng nó để lập một bảng tính excel cho mình.

File excel của em có 2 sheet: 1. ThuVien; 2. BTCP. Trong sheet BTCP khi đánh số thứ tự của Kiểu có trong sheet Thuvien thì code sẽ copy các dòng tương ứng từ sheet ThuVien sang sheet BTCP.

Nhưng hạn chế của code anh Kiên là chỉ có một sheet (BTCP - đang là sheet có số thự tự 2), em muốn file của mình có nhiều sheet mà vẫn tự động update code như sheet BTCP thì làm thế nào? Em không biết VBA nên không biết viết code thế nào; mục đích là làm cho "SHEET2" trong code tự động lấy số thứ tự của sheet khi em copy sheet BTCP ra thành nhiều sheet nữa: sheet3, sheet4, sheet5,... (em có thể xóa bất kỳ sheet nào - trừ sheet thư viện cũng không ảnh hưởng).

Em có kèm theo code bên dưới:
Mã:
'By Luu Trung Kien
'Date 4/2010
'HAM TIM KIEM VI TRI CUA KIEU BEN SHEET THU VIEN
'****************************************************************************************************
Function FIND_INDEX_Kieu(ByVal FindK As String) As Long
Const Start_Index_Data = 5
Dim Rng As Range
If Trim(FindK) <> "" Then
    With Sheet1.Range("C" & Start_Index_Data & ":C" & Sheet1.UsedRange.Rows.Count)
        Set Rng = .Find(what:=FindK, _
                        after:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        lookat:=xlWhole, _
                        searchorder:=xlByRows, _
                        searchdirection:=xlNext, _
                        MatchCase:=False)
        If Not Rng Is Nothing Then
            FIND_INDEX_Kieu = Rng.Row
        Else
            FIND_INDEX_Kieu = 0
        End If
    End With
End If
End Function
'THU TUC COPY TU SHEET THU VIEN SANG SHEET MOI
'****************************************************************************************************
Private Sub Worksheet_Change(ByVal Target As Range)
Const start_index = 7
Dim Row_Index As Long
Dim Row_Data As Long
Dim Row_Height As Long
Dim j As Long
If InStr(Target.Address, "$C$") > 0 Then 'Vi tri cua Cell tai cot C
    If Target.Count <> 1 Then Exit Sub 'Neu chon lon hon thi bo qua
    Row_Data = FIND_INDEX_Kieu(Range("C" & Target.Row))
    If Range("C" & Target.Row) <> "" And Row_Data > 0 Then
        Row_Index = Target.Row
        Row_Height = Sheet1.Range("D" & Row_Data).RowHeight
        [COLOR=#ff0000]Sheet2[/COLOR].Range("D" & Row_Index).RowHeight = Row_Height
        Sheet1.Activate
            Sheet1.Range("D" & Row_Data & ":M" & Row_Data).Select
            Application.CutCopyMode = False
            Selection.Copy
        [COLOR=#ff0000]Sheet2[/COLOR].Select
            [COLOR=#ff0000]Sheet2[/COLOR].Range("D" & Row_Index).Select
            ActiveSheet.Paste
            [COLOR=#ff0000]Sheet2[/COLOR].Range("C" & Row_Index + 1).Select
    Else
    End If
End If
End Sub
 

File đính kèm

Bạn đọc và tải File ở bài viết này (Link bên dưới) để sử dụng code có liên quan đến vấn đề tách nhóm.

Thử File xem kết quả đúng ý bạn chưa, trong File có 2 nút.

- 1 Nút có tên là Tách nhóm: Khi nhấn vào nút này nó sẽ lọc và tách làm ra 3 nhóm: Miền tây, Miền Đông, TP. Hồ Chí Minh.
- 1 Nút có tên là Xóa nhóm vừa tách ra: Khi nhấn vào nút này nó sẽ xóa 3 Sheet "Miền tây", "Miền Đông", "TP. Hồ Chí Minh".

http://www.giaiphapexcel.com/forum/...dữ-liệu-qua-sheet-mới-với-các-điều-kiện/page2
 
Upvote 0
Chí ít phải có chút dữ liệu vừa đủ để có thể hiểu bạn cần gì chứ
 
Upvote 0
Trong file BTCP.xls em gửi em đã tạo 3 hàng Thư viện trong sheet Thuvien rồi đó anh.
Ở sheet BTCP khi đánh mã Kiểu ở cột C trong sheet Thuvien code VBA trên sẽ copy các hàng ở sheet Thuvien sang sheet BTCP. Nhưng với code này file chỉ dùng được 1 sheet BTCP, em muốn có những sheet khác BTCP2, BTCP3, BTCP4,... thì nếu dùng copy sheet BTCP code sẽ không chuyển; vị trí em bôi đỏ "sheet2" trong đoạn code trên vẫn là sheet2 mà đáng nhẽ ra ở các sheet BTCP2, BTCP3, BTCP4,... phải là sheet3, sheet4, sheet5 thì mới chạy được ở các sheet này.
Em gửi lại file bên dưới, có ghi rõ thêm nội dung trong file ở sheet.
 

File đính kèm

Upvote 0
Mình tham gia thế này, xin lỗi tác giả của Code trong bài, mình thay bằng 1 code như sau thôi
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Left(Sh.Name, 4) = "BTCP" And Target.Column = 3 Then
Application.EnableEvents = False
Dim Tm, i, j
Tm = Sheet1.Range("C2:M" & Sheet1.[C65536].End(3).Row)
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) = Target.Value Then
For j = 1 To 10
Target.Offset(, j) = Tm(i, j + 1)
Next
Exit For
End If
Next
Application.EnableEvents = True
End If
End Sub

Cứ Sheet nào có tên bắt đầu bằng BTCP là Code được sử dung (Muốn áp dụng Code đặt tên Sheet là BTCPxxxxx)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia thế này, xin lỗi tác giả của Code trong bài, mình thay bằng 1 code như sau thôi
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Left(Sh.Name, 4) = "BTCP" And Target.Column = 3 Then
Application.EnableEvents = False
Dim Tm, i, j
Tm = Sheet1.Range("C2:M" & Sheet1.[C65536].End(3).Row)
For i = 1 To UBound(Tm, 1)
If Tm(i, 1) = Target.Value Then
For j = 1 To 10
Target.Offset(, j) = Tm(i, j + 1)
Next
Exit For
End If
Next
Application.EnableEvents = True
End If
End Sub

Cứ Sheet nào có tên bắt đầu bằng BTCP là Code được sử dung (Muốn áp dụng Code đặt tên Sheet là BTCPxxxxx)

Cảm ơn anh Sealand nhưng code anh viết không được ạ:
1. Code của anh Sealand chỉ copy giá trị không phải là copy ô như code của anh Kiên, mà em cần là copy cả công thức nữa như copy (Ctrl+C) và paste (Ctrl+V).
2. Điều nữa là: Các sheet thêm mới không phải lúc nào cũng có tên như BTPCxxxxx, vì bóc khối lượng có rất nhiều người đặt tên khác nhau ví dụ: BlockA.tang1, BlockB.tang3,... nên không thể dùng tên sheet viết code được, ở đây chỉ dùng số thứ tự của sheet hiện hành để viết code.

Anh Sealand nghiên cứu giúp em vụ này tiếp nha^^ Cảm ơn anh nhiều.
 
Upvote 0
Bạn thử code này
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, [c6:c10000]) Is Nothing Then
        If ActiveSheet.Name <> "ThuVien" Then
            tmp = 0
            tmp = Sheets("ThuVien").[c6:c65000].Find([c65000].End(3), , , 1).Address
            If tmp > 0 Then
                Application.EnableEvents = False
                Sheets("ThuVien").Range(tmp)(1, -1).Resize(, 13).Copy [c65000].End(3)(1, -1)
            End If
            Application.EnableEvents = True
        End If
    End If
End Sub
 
Upvote 0
Đối với việc copy thì không có vấn đề gì, chắc chắn không rườm rà như Code của bạn. Bạn xem bài của bác Trung Chinh thấy gọn gàng hơn không?
Vấn đề ở đây là bạn phải chỉ cho rõ những Sheet nào có thể áp dụng chả lẽ tất tần tật.

To Trung Chinh:
Đoạn sau không hợp lý:


Sheets("ThuVien").Range(tmp)(1, -1).Resize(, 13).Copy [c65000].End(3)(1, -1)

Nếu sửa ở giữa thì sao? Ta nên tận dụng cái mốc Target để Paste thì hợp lý hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong file BTCP.xls em gửi em đã tạo 3 hàng Thư viện trong sheet Thuvien rồi đó anh.
Ở sheet BTCP khi đánh mã Kiểu ở cột C trong sheet Thuvien code VBA trên sẽ copy các hàng ở sheet Thuvien sang sheet BTCP. Nhưng với code này file chỉ dùng được 1 sheet BTCP, em muốn có những sheet khác BTCP2, BTCP3, BTCP4,... thì nếu dùng copy sheet BTCP code sẽ không chuyển; vị trí em bôi đỏ "sheet2" trong đoạn code trên vẫn là sheet2 mà đáng nhẽ ra ở các sheet BTCP2, BTCP3, BTCP4,... phải là sheet3, sheet4, sheet5 thì mới chạy được ở các sheet này.
Em gửi lại file bên dưới, có ghi rõ thêm nội dung trong file ở sheet.

1. Có thể tìm dòng trong sheet1 bằng cách khác nhưng thôi tôi giữ nguyên code của hàm FIND_INDEX_Kieu

2. Bạn xóa hết các code của các sheet. Chả nhẽ bạn có 20 sheet BTCP thì copy 20 phiên bản của Sub và Function?

3. phải chuột trên ThisWorkbook và nhập code

Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Row_Data As Long
    If Not Sh Is Sheet1 And Not Intersect(Target, Sh.Range("C:C")) Is Nothing And Target.Count = 1 Then
        If Target.Value <> "" Then
            Row_Data = FIND_INDEX_Kieu(Target.Value)
            If Row_Data > 0 Then
                Application.EnableEvents = False
                [COLOR=#ff0000]Target.RowHeight = Sheet1.Range("D" & Row_Data).RowHeight[/COLOR]
                Sheet1.Range("D" & Row_Data).Resize(, 10).Copy Target.Offset(, 1)
                [COLOR=#0000ff]Target.Offset(1).Select[/COLOR]
                Application.EnableEvents = True
            End If
        End If
    End If
End Sub

Tôi không hiểu dòng đỏ đỏ tác giả định làm gì. Không cần thiết thì xóa đi. Nếu trong Excel Options Enter luôn là xuống dòng thì bỏ dòng xanh xanh đi

Cũng đưa code của hàm FIND_INDEX_Kieu vào ThisWorkbook

4. Tôi chỉ copy vùng y hệt như code cũ thôi. Không dám sửa vì sợ không đúng ý.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh TrungChinhs và anh Siwtom nhiều ạ! Code này gọn hơn nhiều, chạy ngon rồi ạ!

@Siwtom: Màu đỏ đỏ là để giữ nguyên chiều cao của hàng bên sheet Thuvien. Màu xanh xanh bỏ đi được ạ.
 
Upvote 0
Cảm ơn anh TrungChinhs và anh Siwtom nhiều ạ! Code này gọn hơn nhiều, chạy ngon rồi ạ!

@Siwtom: Màu đỏ đỏ là để giữ nguyên chiều cao của hàng bên sheet Thuvien. Màu xanh xanh bỏ đi được ạ.

Chiều cao do dữ liệu quyết định, nên màu đỏ đỏ bạn thử bỏ đi xem sao???
cứ bỏ đi xem thế nào
 
Upvote 0
1/Mình sửa lại Code theo yêu cầu của bạn:
Bạn nên dùng 1 cột của Sheet thư viện làm danh sách các Sheet áp dụng code cho minh bạch.

Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error GoTo End_Code1
If WorksheetFunction.Match(Sh.Name, Sheet1.Columns("O"), 0) > 0 And Target.Column = 3 Then
Application.EnableEvents = False
Dim Tm, i, j, eR As Long
On Error GoTo End_Code2
eR = WorksheetFunction.Match(Target.Value, Sheet1.Columns("C"), 0)
Sheet1.Range("D" & eR & ":N" & eR).Copy Target.Offset(, 1)
Application.EnableEvents = True
End If
End_Code1:
Application.EnableEvents = True
Exit Sub
End_Code2:
Target.Offset(, 1).Resize(, 10).ClearContents
MsgBox "Kieu trong hoac khong co trong thu vien"
GoTo End_Code1
End Sub

Với bài này nếu dừng ở mức độ này mình thấy thiêu thiếu 1 chút: Nếu ta điều chỉnh thư viện 1 chút thì sao? Các thay đổi phải được cập nhật sang các sheet bóc tách chứ.

2/Mình tham gia ngoài rìa 1 chút: Khi học, sưu tầm Code ta phải biết chọn lọc, cái gì dùng , cái gì thay thế cho hợp lý. Mình thấy Code của bạn như Bác Siwtom đã nêu có nhiều chỗ vô tác dụng với yêu cầu bài này. Riêng mình, hàm Find_Index_KIEU là vô duyên vì đồ sẵn có vừa gọn vừa chính xác vừa nhanh sao ta không dùng.

3/Bạn nên hỏi bài, gửi bài 1 cách rõ ràng và chi tiết thì mọi người mới biết cách giúp bạn thoả đáng được. Chứ như bài trước của mình bạn nói Code không được, nhưng mình so với yêu cầu bài 1 thì chẳng có chi là không được. Cái không được là bây giờ bạn mới đưa ra. Chính vì cách hỏi này mà Bác Siwtom không dám chỉnh Code của bạn dù bất hợp lý nhưng biết đâu không đúng ý bạn chưa nói ra.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1. Chiều cao hàng trong thư viện sẽ được fix cố định sao cho đẹp nhất, ngoài dữ liệu là chữ còn có hình vẽ trong đó nữa (bóc tách cấu kiện thép - hình dạng thanh thép) nên nếu không fix cố định thì khi sang sheet tính toán sẽ xảy ra tình trạng không đẹp.

Em không biết gì về lập trình nên không hiểu là có thể đặt code ở workbook thì nó áp dụng cho toàn bộ các sheet ^^ nên câu hỏi nó mới lòng vòng :D.

2. Em có một ý tưởng mới nảy sinh là: Khi thực hiện lệnh (điền số thứ tự kiểu vào sheet tính toán rồi enter hoặc tab) thì code sẽ thực hiện ngay việc copy từ sheet thư viện sang; vậy khi không ưng ý hàng đó có thể dùng code chỉ cần bấm Ctrl+Z là xóa ngay hàng vừa tạo ra không? Đỡ phải chọn hàng rồi xóa mất thời gian hơn^^ Nếu không được thì code này em cũng ƯNG lắm rồi ạ! Cảm ơn các anh rất nhiều ạ!
 
Upvote 0
Bạn nên chọn phím tắt không trùng với các phím tắt của Exc kẻo được cái nọ mất cái kia. Bạn viết code (Hoặc Rec Macro) xoá dòng rồi gán phím tắt cho nó
 
Upvote 0
1/Mình sửa lại Code theo yêu cầu của bạn:
Bạn nên dùng 1 cột của Sheet thư viện làm danh sách các Sheet áp dụng code cho minh bạch.

Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error GoTo End_Code1
If WorksheetFunction.Match(Sh.Name, Sheet1.Columns("O"), 0) > 0 And Target.Column = 3 Then
Application.EnableEvents = False
Dim Tm, i, j, eR As Long
On Error GoTo End_Code2
eR = WorksheetFunction.Match(Target.Value, Sheet1.Columns("C"), 0)
Sheet1.Range("D" & eR & ":N" & eR).Copy Target.Offset(, 1)
Application.EnableEvents = True
End If
End_Code1:
Application.EnableEvents = True
Exit Sub
End_Code2:
Target.Offset(, 1).Resize(, 10).ClearContents
MsgBox "Kieu trong hoac khong co trong thu vien"
GoTo End_Code1
End Sub

Với bài này nếu dừng ở mức độ này mình thấy thiêu thiếu 1 chút: Nếu ta điều chỉnh thư viện 1 chút thì sao? Các thay đổi phải được cập nhật sang các sheet bóc tách chứ.

2/Mình tham gia ngoài rìa 1 chút: Khi học, sưu tầm Code ta phải biết chọn lọc, cái gì dùng , cái gì thay thế cho hợp lý. Mình thấy Code của bạn như Bác Siwtom đã nêu có nhiều chỗ vô tác dụng với yêu cầu bài này. Riêng mình, hàm Find_Index_KIEU là vô duyên vì đồ sẵn có vừa gọn vừa chính xác vừa nhanh sao ta không dùng.

3/Bạn nên hỏi bài, gửi bài 1 cách rõ ràng và chi tiết thì mọi người mới biết cách giúp bạn thoả đáng được. Chứ như bài trước của mình bạn nói Code không được, nhưng mình so với yêu cầu bài 1 thì chẳng có chi là không được. Cái không được là bây giờ bạn mới đưa ra. Chính vì cách hỏi này mà Bác Siwtom không dám chỉnh Code của bạn dù bất hợp lý nhưng biết đâu không đúng ý bạn chưa nói ra.
chào Sealand. mình củng có file thống kê thép của Trung Kiên, giờ mình muốn đưa code trên vào file đính kèm để được nhiều sheet "TKThep 5 can" mà không được, bạn giúp mình với nhé.
Cảm ơn rất nhiều.

http://www.mediafire.com/view/h0epec63wyeqdhy/mau_thong_ke_thep_.xls
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom