Lập trình VBA để tạo bảng biểu trong Excel (1 người xem)

  • Thread starter Thread starter bee111
  • Ngày gửi Ngày gửi
Liên hệ QC

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

bee111

Thành viên mới
Tham gia
19/8/11
Bài viết
35
Được thích
1
Xin chào toàn thể anh chị em trên diễn đàn.
- em muốn nhờ các bác viết hộ em đoạn code VBA để chạy bảng biểu như sau:
- em có 1 file nguồn Excel gồm 1 sheet có 4 cột A_B_C_D_E trong đó dữ liệu gồmcác bảng số liệu khác nhau.
- Các bác viết giúp em đoạn VBA để chạy ra bảng như mẫu em gửi file.

Em xin cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
(1) Báo lỗi gì bạn tuy chưa đưa lên, nhưng mình cũng đoán ra là bạn chưa chép macro thứ 2 vô chung module với macro 1
Nội dung 2 macro này cần được chép đè lên toàn bộ 2 macro cũ; Nế không được nữa, thì chờ đi vậy.

(2) Sao bạn nói suông không vậy; Cụ thể số liệu 240.3 m là bằng số nào cộng hay trừ với số nào;

Mình lấy 158.2 - (-82.1) => 240.3 rồi còn gì?

Nếu chỉ đơn giản là số cuối trừ đi số đầu của 1 mặt cắt, mà mất bao giấy mực & thời gian với bạn rồi?!

. . . . .


Oh, quá chuyên ngành , bài toán chuyên ngành đây

Mình lấy 158.2 - (-82.1) => 240.3 rồi còn gì?

chính xác kết quả là 178.4 = 158.2 - -82.1 - 61.9(ướt) ==> đây là bài toán về khoảng cách thôi

hehe, ướt với khô cứ loạn thế này đây, không trau chuốt câu hỏi, chứng tỏ người hỏi chưa quan tâm thấy cần công sức người lời hay sao ý,

@vui vui: Có 1 thắc mắc cần giải đáp gấp: sao bài này mấy nhân vật: Hyen, SaDQ, ChanhTQ.... cứ chém gió nhau vu vù vù vậy nhỉ??? phải chăng họ đang định tranh hùng, chắc là Hyen17 viết code chuẩn hay chưa chuẩn quá đây(???)
 
Lần chỉnh sửa cuối:
Upvote 0
Oh, quá chuyên ngành , bài toán chuyên ngành đây

Mình lấy 158.2 - (-82.1) => 240.3 rồi còn gì?



chính xác kết quả là 178.4 = 158.2 - -82.1 - 61.9(ướt) ==> đây là bài toán về khoảng cách thôi

hehe, ướt với khô cứ loạn thế này đây, không trau chuốt câu hỏi, chứng tỏ người hỏi chưa quan tâm công sức người trả lời hay sao ý,

Mình lờ mờ cũng đoán ra như vậy, nhưng sợ sai fương hướng lần nữa!
Mà sai hướng rồi thì, . . . chỉ nhận được bài tự học về giải fáp thôi, chả hề có gì khác nữa, cho mình & cho người nào đó!

(*) Hôm nay mình thêm 1 kết luận:

"Một khi viết mà người khác không hiểu, thì ngược lại, thường sẽ khó để hiểu được người khác viết gì!"

/-)ây là toàn bộ giải fáp theo í tưởng đó cuả bạn:

Mã:
Option Explicit
Dim Song As String
Dim Cls As Range, Sh As Worksheet:
Dim Ngay As Date, MCt As Byte
[B]Sub ThongKe[/B]
 Dim eRw As Long, So0 As Long, SoC As Integer, Jj As Byte, FU As Double, FC As Double
 Dim Blk As Range, fRg As Range, RgC As Range, RgD As Range, tRg As Range
 Const KT As String = " "
 
 Sheets("HQL").Select
 Set Sh = ThisWorkbook.Worksheets("KQua")
 Sh.Columns("A:F").Insert Shift:=xlToRight
 Sh.Columns("G:L").Delete Shift:=xlToLeft
 eRw = [A65500].End(xlUp).Row
 Song = [A1].Value:                             Set fRg = [A2]
 Do
    Ngay = fRg.Offset(1).Value:                 MCt = fRg.Value
    If fRg.Row >= eRw Then Exit Do
    FC = fRg.Offset(2, 1).End(xlDown).Value
    Set Blk = Range(fRg, fRg.Offset(2, 1).End(xlDown).Offset(, -1))
    Set tRg = Blk(1).Offset(Blk.Rows.Count)     'O Cuói Cua Mat Cát'
    SoC = Abs(tRg.Offset(-1).Value)
    Set RgC = [BA1].Resize(210).Find(SoC, , xlFormulas, xlWhole)
    If Not RgC Is Nothing Then
        Set RgD = Sh.[A65500].End(xlUp).Offset(2)
[COLOR=#0000ff]'Chép Tù Form:'[/COLOR]
        [BA1].Resize(RgC.Row + 1, 5).Copy Destination:=RgD
        With RgD
            .Value = .Value & KT & Song
            .Offset(1).Value = .Offset(1).Value & KT & MCt
            .Offset(2).Value = .Offset(2).Value & KT & Ngay
            Randomize
            .Offset(4).Resize(2 * Blk.Rows.Count - 1, 5).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
        End With
[COLOR=#0000ff]'Chép Só Lieu Sang KQua:'[/COLOR]
        Jj = 3
        For Each Cls In Range(fRg.Offset(2), tRg)
            Jj = Jj + 2
            If Jj = 5 Then FC = FC - Cls.Offset(, 1).Value[COLOR=#0000ff] '?'[/COLOR]
            If Cls.Value = 0 And Cls.Value <> "" Then  [COLOR=#0000ff] '*'[/COLOR]
                So0 = So0 + 1
                If So0 Mod 2 = 1 Then
                    FU = Cls.Offset(, 1).Value
                Else
                    FU = Abs(Cls.Offset(, 1) - FU)
                End If
            End If
            RgD.Offset(Jj, 2).Resize(, 2).Value = Cls.Offset(, 1).Resize(, 2).Value
            RgD.Offset(Jj, 4).Value = Cls.Offset(, 4).Value
            With Cls.Offset(1, 1)
                If .Row < tRg.Row Then _
                    RgD.Offset(Jj + 1, 1).Value = Abs(.Offset(-1).Value - .Value)
            End With
        Next Cls
        GPE Sh.[A65500].End(xlUp).Offset(1).Resize(, 5)
        With Sh.[A65500].End(xlUp).Offset(1)
            .Value = [BG1].Value & KT & CStr(FU)  [COLOR=#0000ff]  '<=|'[/COLOR]
            .Offset(1).Value = [bg2].Value & KT & CStr(FC - FU)
        End With
        Set fRg = tRg
    End If
 Loop
 Sh.Select:                                     Set Sh = Nothing
[B]End Sub[/B]

PHP:
Sub GPE(Rng As Range)                           'Ke Dòng Cuói Cua Bang'
 With Rng.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlMedium
 End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình lờ mờ cũng đoán ra như vậy, nhưng sợ sai fương hướng lần nữa!
Mà sai hướng rồi thì, . . . chỉ nhận được bài tự học về giải fáp thôi, chả hề có gì khác nữa, cho mình & cho người nào đó!

(*) Hôm nay mình thêm 1 kết luận:

"Một khi viết mà người khác không hiểu, thì ngược lại, thường sẽ khó để hiểu được người khác viết gì!"

/-)ây là toàn bộ giải fáp theo í tưởng đó cuả bạn:

Mã:
Option Explicit
Dim Song As String
Dim Cls As Range, Sh As Worksheet:
Dim Ngay As Date, MCt As Byte
[B]Sub ThongKe[/B]
 Dim eRw As Long, So0 As Long, SoC As Integer, Jj As Byte, FU As Double, FC As Double
 Dim Blk As Range, fRg As Range, RgC As Range, RgD As Range, tRg As Range
 Const KT As String = " "
 
 Sheets("HQL").Select
 Set Sh = ThisWorkbook.Worksheets("KQua")
 Sh.Columns("A:F").Insert Shift:=xlToRight
 Sh.Columns("G:L").Delete Shift:=xlToLeft
 eRw = [A65500].End(xlUp).Row
 Song = [A1].Value:                             Set fRg = [A2]
 Do
    Ngay = fRg.Offset(1).Value:                 MCt = fRg.Value
    If fRg.Row >= eRw Then Exit Do
    FC = fRg.Offset(2, 1).End(xlDown).Value
    Set Blk = Range(fRg, fRg.Offset(2, 1).End(xlDown).Offset(, -1))
    Set tRg = Blk(1).Offset(Blk.Rows.Count)     'O Cuói Cua Mat Cát'
    SoC = Abs(tRg.Offset(-1).Value)
    Set RgC = [BA1].Resize(210).Find(SoC, , xlFormulas, xlWhole)
    If Not RgC Is Nothing Then
        Set RgD = Sh.[A65500].End(xlUp).Offset(2)
[COLOR=#0000ff]'Chép Tù Form:'[/COLOR]
        [BA1].Resize(RgC.Row + 1, 5).Copy Destination:=RgD
        With RgD
            .Value = .Value & KT & Song
            .Offset(1).Value = .Offset(1).Value & KT & MCt
            .Offset(2).Value = .Offset(2).Value & KT & Ngay
            Randomize
            .Offset(4).Resize(2 * Blk.Rows.Count - 1, 5).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
        End With
[COLOR=#0000ff]'Chép Só Lieu Sang KQua:'[/COLOR]
        Jj = 3
        For Each Cls In Range(fRg.Offset(2), tRg)
            Jj = Jj + 2
            If Jj = 5 Then FC = FC - Cls.Offset(, 1).Value[COLOR=#0000ff] '?'[/COLOR]
            If Cls.Value = 0 And Cls.Value <> "" Then  [COLOR=#0000ff] '*'[/COLOR]
                So0 = So0 + 1
                If So0 Mod 2 = 1 Then
                    FU = Cls.Offset(, 1).Value
                Else
                    FU = Abs(Cls.Offset(, 1) - FU)
                End If
            End If
            RgD.Offset(Jj, 2).Resize(, 2).Value = Cls.Offset(, 1).Resize(, 2).Value
            RgD.Offset(Jj, 4).Value = Cls.Offset(, 4).Value
            With Cls.Offset(1, 1)
                If .Row < tRg.Row Then _
                    RgD.Offset(Jj + 1, 1).Value = Abs(.Offset(-1).Value - .Value)
            End With
        Next Cls
        GPE Sh.[A65500].End(xlUp).Offset(1).Resize(, 5)
        With Sh.[A65500].End(xlUp).Offset(1)
            .Value = [BG1].Value & KT & CStr(FU)  [COLOR=#0000ff]  '<=|'[/COLOR]
            .Offset(1).Value = [bg2].Value & KT & CStr(FC - FU)
        End With
        Set fRg = tRg
    End If
 Loop
 Sh.Select:                                     Set Sh = Nothing
[B]End Sub[/B]

PHP:
Sub GPE(Rng As Range)                           'Ke Dòng Cuói Cua Bang'
 With Rng.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlMedium
 End With
End Sub
Em cảm ơn các bác đã quan tâm câu hỏi của em. Đúng như các bác suy luận kết quả phần ướt = B13-B9= 120.4-58.5 = 61.9 và phần cạn = B16-B4-phần ướt = 158.2-(-82.1)-61.9= 240.3-61.9=178.4.
Có gì sai sót mong các bác thông cảm.
- Bác cho em hỏi : em đã mở file nguồn ấn alt + f11 rồi tạo 1 module mới rồi copy 2 đoạn code trên dán vào đó, nhưng ấn f5 chạy thì nó báo lỗi màu vàng ở dòng code sau :
Set Sh = ThisWorkbook.Worksheets("KQua")
Do em mới làm quen với GPE nên không biết nguyên nhân do đâu, mong các bác hướng dẫn cụ thể giúp em. em xin cảm ơn.
 
Upvote 0
Em đã mở file nguồn ấn alt + f11 rồi tạo 1 module mới rồi copy 2 đoạn code trên dán vào đó, nhưng ấn f5 chạy thì nó báo lỗi màu vàng ở dòng code sau :
Set Sh = ThisWorkbook.Worksheets("KQua")
Do em mới làm quen với GPE nên không biết nguyên nhân do đâu, mong các bác hướng dẫn cụ thể giúp em.

Nghĩa báo lỗi ngay từ đầu chương trình; & như vậy là bạn chưa có trang tính mang tên 'KQua' trong file; Bạn hãy đổi tên 1 trang tính trống nào đó thành tên như vậy & chạy macro;
Khi đó kết quả macro sẽ hiện trên trang này

(húc thành công!
 
Upvote 0
Em đã tạo 1 sheet "KQUA" trong file nguon rồi ấn F5 để chạy nhưng máy bị treo luôn, không có thông báo gì cả. em gởi file chạy đó bácxem hộ em với nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thứ nhất, mình iêu cầu gán tên là 'KQua', bạn lại 'KQUA' làm chi máy nó hiểu?!

Thứ hai: Trong 'HQL' có vùng [BA1..BE210] là vùng làm Form cho 'KQua' bạn chắc chưa có!
Hãy tạo vùng này để các câu lệnh sau làm việc 1 cách bình thường:

PHP:
    Set RgC = [BA1].Resize(210).Find(SoC, , xlFormulas, xlWhole)
    If Not RgC Is Nothing Then
        Set RgD = Sh.[A65500].End(xlUp).Offset(2)
'Chép Tù Form:'
        [BA1].Resize(RgC.Row + 1, 5).Copy Destination:=RgD

. . . . . . Có thể còn 1 số lỗi nữa, sau khi bạn xử 2 vụ trên, nhưng giờ hết thời gian của ngày rồi; Hẹn mai nha!

(húc ngủ ngon &ới giấc mơ đẹp nhứt có thể!
 
Upvote 0
Thứ hai: Trong 'HQL' có vùng [BA1..BE210] là vùng làm Form cho 'KQua' bạn chắc chưa có!
Hãy tạo vùng này để các câu lệnh sau làm việc 1 cách bình thường:

PHP:
    Set RgC = [BA1].Resize(210).Find(SoC, , xlFormulas, xlWhole)
    If Not RgC Is Nothing Then
        Set RgD = Sh.[A65500].End(xlUp).Offset(2)
'Chép Tù Form:'
        [BA1].Resize(RgC.Row + 1, 5).Copy Destination:=RgD

. . . . . . Có thể còn 1 số lỗi nữa, sau khi bạn xử 2 vụ trên, nhưng giờ hết thời gian của ngày rồi; Hẹn mai nha!

(húc ngủ ngon &ới giấc mơ đẹp nhứt có thể!
Em xin cảm ơn bác HYEN 17. Em đã sửa tên sheet KQua rồi, nhưng em vẫn chưa hiểu vùng
[BA1..BE210]
là vùng nào và cách tạo như thế nào. Bác chỉ rõ giúp em với nhé. (em đã gởi file nguồn và code của bác trong đó bác chạy luôn trên file đó rồi sửa hộ em với. Em dốt Excel lắm.
 
Upvote 0
======>>=======>>======>> Xin các bạn xem file tại bài kế tiếp liền kề ======>>=======>>======>>
 
Lần chỉnh sửa cuối:
Upvote 0
Code bác SA_DQ chạy rất tốt, bác cao thủ quá. Em có chút này nhờ bác thêm:
- Ngày đo của mỗi bảng viết theo ngày - tháng - năm. (15-7-2011)
- Code nằm ở 1 file excel riêng. Khi chạy code thì tự động mở file "Nguon.xls" để xử lý.
- Tên sheet file nguồn luôn thay đổi, nên bác viết cho em chọn sheet đang active
- Xuất riêng ra 1 file KQua.xls với tên sheet trùng với tên sheet file nguồn.
Bác bớt chút thời gian giúp em với nhé.
 
Upvote 0
Em có chút này nhờ (ác) bác thêm:
(1) - Ngày đo của mỗi bảng viết theo ngày - tháng - năm. (15-7-2011)
(2) - Code nằm ở 1 file excel riêng. Khi chạy code thì tự động mở file "Nguon.xls" để xử lý.
(2A)- Tên sheet file nguồn luôn thay đổi, nên bác viết cho em chọn sheet đang active
(2b)- Xuất riêng ra 1 file KQua.xls với tên sheet trùng với tên sheet file nguồn.
(Các) Bác bớt chút thời gian giúp em với nhé.

(1) Ngày tháng bạn viết kểu nào tùy thích; macro chi làm cái chuyện copy sang 'KQua' mà thôi;

(2.. .2b) Bạn nào khác giúp bạn í với; Mình không quen viết cho các file khác nhau;
Thông cảm, theo mình thì chả cần gì & chả khi nào fải để dữ liệu ở các file khác nhau cả; Vạn bất bắt dĩ thì làm thủ công. (Theo fương châm ăn chắc, mặt bền)

Bye, bye!

Bổ sung:
(1) Mình thêm câu lệnh định dạng ngày tháng, nhưng cái này tùy thuộc vô máy mỗi người!
(2) Mình đưa file lên, trong đó có 2 trang 'HQL0' & HQL2'; Bạn có thể có nhiều trang 'HQLx' tùy í & bao nhiêu cũng OK
Khi chạy, macro sẽ hỏi bạn cần trang nào; Hãy bấm vô nút OK khi gặp trang tính cần thống kê số liệu
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom