Tạo macro tự động cập nhật dữ liệu

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

heocon

Thành viên chính thức
Tham gia
15/12/07
Bài viết
59
Được thích
14
Chào các anh chị GPE!

Hôm nay em có 1 bài toán cần nhờ sự giúp đở của các anh chị. Em không phải diển giải như thê nào để mọi nguời hiểu. Em muốn tạo 1 file xuất Hóa Đơn, dữ liệu tại Sheet Data sẽ đuợc tự động cập nhật vào Sheet hóa đơn. Theo 3 trường hợp (Em có nêu cụ thể trong Sheet yeu cau).

Dữ liệu bên Sheet Data được xuất ra từ phần mềm, nên chỉ sử dụng cho 1 hóa đơn rùi thôi. Sheet Data sẽ được làm mới khi muốn xuất hóa đon #.
Nhập từng đợt rồi xóa đi, nhập đợt khác? Như vậy mỗi đợt nhập có số dòng khoảng tối đa là 10 dòng & tối thiểu 3 dòng

Các anh chị có thể liên hệ với em qua email: heocon_8529@yahoo.com
Mong được sự giúp đở nhiệt tình từ các anh chị.
Chúc mọi nguời luôn vui vẽ.

Thân!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Căn cứ theo số dòng kể từ dòng 23 & dữ liệu trong ô E23

Thử & cho biết còn phải sửa gì nữa không, nha!
PHP:
Option Explicit

Sub AddFor()
 Dim lRow As Long, jW As Long
 Dim B16 As String, F16 As Byte
 
 Application.ScreenUpdating = False
 Sheets("Data").Select:                 lRow = [D65432].End(xlUp).Row
 If lRow = 21 Then Exit Sub
 B16 = [D22] & "-" & Right(Range("D" & lRow), 3)
 If [E22] = "" Then
    F16 = lRow - 21
 Else
    If lRow = 24 Then F16 = 1 Else F16 = 2
 End If
 Sheets("HoaDon").[B16] = B16:          Sheets("HoaDon").[F16] = F16
 
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác SA ơi!
Sao em không thấy nó cập nhật vậy? Em không thấy macro chạy.
Cám ơn anh nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Gởi lên 4 trường hợp đi, nha!

HeoCon gởi lên 4 trường hợp xem sao;
(Xóa hết các dòng từ A22:e33 đi)
Ghi hết các records vô A22: E(22+i) thực tế, mà khi ấy phải chọn trường hợp 1;
Chép dòng tiêu đề A21:G21 đến A35..
Ghi hết các records vô A36: E(36+J) thực tế, mà khi ấy phải chọn trường hợp 2;
Chép dòng tiêu đề A21:G21 đến A50..
Ghi hết các records vô A51: E(51+z) thực tế, mà khi ấy phải chọn trường hợp 3;

. . . . . .
Đừng có ghi chung 1 chổ khó hiểu lắm đó;
 
Upvote 0
Em gửi lại file yêu cầu!

Sheet Hoa Don là Sheet em mong muốn
Các Sheet truong hop thực ra là nằm trên 1 Sheet, nhưng em chia ra nhiều Sheet để dể nhìn.

* Nhập từng đợt rồi xóa đi, nhập đợt khác? Như vậy mỗi đợt nhập có số dòng khoảng bao nhiêu là tối đa & tối thiểu;
Số dòng tối đa không xác định.

Cám ơn các anh rất nhiều!
 

File đính kèm

Upvote 0
Vẩn không thể nhiìn ra sự khác nhau của 2 trường hợp đầu

Sheet Hoa Don là Sheet em mong muốn
Các Sheet truong hop thực ra là nằm trên 1 Sheet, nhưng em chia ra nhiều Sheet để dể nhìn. Số dòng tối đa không xác định.!
Không thấy sự khác nhau giữa sheet TrHop2 & TrHop5
Nên chỉ mới viết cho TrHop3
PHP:
Option Explicit
Sub CopyTo3()
 Dim lRow As Long, jW As Long, lRow1 As Long
 Dim SoLg As Byte
 Dim HTrinh As String, SoVe As String
 Dim DonGia As Double, TTien As Double
 
 Sheets("HOA DON").Range("A2:E" & ([A65432].End(xlUp).Row + 9)).ClearContents
 Sheets("Data").Select:                         lRow = [A65432].End(xlUp).Row
 SoVe = [A2]
 For jW = 2 To lRow
    With Range("B" & jW)
        Select Case .Value
        Case ""
            If SoLg = 0 Then
                SoLg = 1:                       SoVe = .Offset(, -1)
                DonGia = .Offset(, 2):          HTrinh = .Offset(, 3)
                If .Offset(1) <> "" Then
                    lRow1 = Sheets("HOA DON").Range("A65432").End(xlUp).Row + 1
                    Sheets("HOA DON").Range("A" & lRow1) = SoVe
                    Sheets("HOA DON").Range("B" & lRow1) = HTrinh
                    Sheets("HOA DON").Range("C" & lRow1) = SoLg
                    TTien = DonGia * SoLg:      SoLg = 0
                    Sheets("HOA DON").Range("D" & lRow1) = DonGia
                    Sheets("HOA DON").Range("E" & lRow1) = TTien
                End If
            Else
                SoLg = SoLg + 1:
                If .Offset(1) <> "" Then
                    lRow1 = Sheets("HOA DON").Range("A65432").End(xlUp).Row + 1
                    SoVe = SoVe & "-" & Right$(.Offset(, -1), 3)
                    Sheets("HOA DON").Range("A" & lRow1) = SoVe
                    Sheets("HOA DON").Range("B" & lRow1) = HTrinh
                    Sheets("HOA DON").Range("C" & lRow1) = SoLg
                    TTien = DonGia * SoLg:      SoLg = 0
                    Sheets("HOA DON").Range("D" & lRow1) = DonGia
                    Sheets("HOA DON").Range("E" & lRow1) = TTien
                End If
            End If
        Case Is <> ""
                
 
    
        End Select
    End With
 Next jW
 
End Sub
 

File đính kèm

Upvote 0
;;;;;;;;;;;
Thank anh nhiều!
Thực chất chỉ có 2 Trường hợp thôi, nhưng vì anh muốn thêm vài ví dụ nên em mới chia thanh 5 trường hợp.
TH3 anh làm như vậy là đúng rùi. Bây chỉ còn TH1 nữa thôi, các TH # là ví dụ thêm để anh hiểu mà thôi.

Không thấy sự khác nhau giữa sheet TrHop2 & TrHop5
Có khác chứ TH2 có hành trình F
Em có sữa lại dữ liệu (file trước bị sai)
 

File đính kèm

Upvote 0
Thank anh nhiều! Thực chất chỉ có 2 Trường hợp thôi, nhưng vì anh muốn thêm vài ví dụ nên em mới chia thanh 5 trường hợp.
TH3 anh làm như vậy là đúng rùi. Bây chỉ còn TH1 nữa thôi, các TH # là ví dụ thêm để anh hiểu mà thôi. Em có sữa lại dữ liệu (file trước bị sai)
HeoCon ơi là HeoCon, đưa dữ liệu sai, có chết người ta không kia chứ!

/-(ỏi câu cuối nè: Tại sao 8 dòng đầu trong sheets("Data") lại chép thành 2 dòng, nhưng 8 dòng cuối lại ghi thành 1 dòng? Dựa theo tiêu chí nào để ghi như vậy?!?
 
Upvote 0
HeoCon ơi là HeoCon, đưa dữ liệu sai, có chết người ta không kia chứ!
-\\/. Con xin lổi Bác.

/-(ỏi câu cuối nè: Tại sao 8 dòng đầu trong sheets("Data") lại chép thành 2 dòng, nhưng 8 dòng cuối lại ghi thành 1 dòng? Dựa theo tiêu chí nào để ghi như vậy?!?

Bác để ý kỹ sẽ thấy hành trình # nhau. Nhưng cùng loại là vé nối.
Nếu 2 vé nối giống nhau về hành trình thì gộp lại 1 dòng. Còn # nhau thì để 2 dòng.

Con cám ơn Bác đã giúp đở ;;;;;;;;;;;
 
Upvote 0
-\\/. http://giaiphapexcel.com/forum/showthread.php?t=9456#6
Bây giờ Bác thử làm theo ý của Bác, không gộp lại (2 dòng)truớc đi. Con sẽ phân tích dữ liệu lại có nên gộp hay không.
Sáng nay con đi chuẩn bị cho Hội chợ Du Lịch Đầm Sen, có j con sẽ liên lạc với Bác sau.

PHP:
Option Explicit
 Dim Solg As Byte:                              Dim DonGia As Double
 Dim HTrinh As String, SoVe As String
 

Sub SearchData()
 Dim lRow As Long, jW As Long
 
 Sheets("HOA DON").Range("A2:E" & ([A65432].End(xlUp).Row + 9)).ClearContents
 Sheets("Data").Select:                         lRow = [A65432].End(xlUp).Row
 SoVe = [A2]
 For jW = 2 To lRow
    With Range("B" & jW)
        Select Case .Value
        Case ""
            If Solg = 0 Then
                Solg = 1:                       SoVe = .Offset(, -1)
                DonGia = .Offset(, 2):          HTrinh = .Offset(, 3)
                If .Offset(1) <> "" Then _
                    CopyTo SoVe, HTrinh, Solg, DonGia
                    
            Else
                Solg = Solg + 1:
                If .Offset(1) <> "" Then
                    SoVe = SoVe & "-" & Right$(.Offset(, -1), 3)
                    
                    CopyTo SoVe, HTrinh, Solg, DonGia
                    
                End If
            End If
        Case Is <> ""
            If IsNumeric(.Value) Then
                HTrinh = HTrinh & .Offset(, 3)  ' "-" '
                SoVe = SoVe & "-" & Str(.Value)
                
                CopyTo SoVe, HTrinh, Solg, DonGia
                
            Else
                If Left(.Value, 1) = "_" Then
                    SoVe = .Offset(, -1):       Solg = .Offset(, 1)
                    DonGia = .Offset(, 2):      HTrinh = Left(.Offset(, 3), 1)
                Else
                    HTrinh = HTrinh & Left(.Offset(, 3), 1)
                End If
            End If
        End Select
    End With
 Next jW
End Sub

PHP:
Sub CopyTo(SoVe As String, HTrinh As String, Solg As Byte, DonGia As Double)
 Dim lRow1 As Long:             Dim TTien As Double
 
 lRow1 = Sheets("HOA DON").Range("A65432").End(xlUp).Row + 1
 Sheets("HOA DON").Range("A" & lRow1) = SoVe
 Sheets("HOA DON").Range("B" & lRow1) = HTrinh
 Sheets("HOA DON").Range("C" & lRow1) = Solg
 TTien = DonGia * Solg:                     Solg = 0
 Sheets("HOA DON").Range("D" & lRow1) = DonGia
 Sheets("HOA DON").Range("E" & lRow1) = TTien

End Sub
 

File đính kèm

Upvote 0
Nếu theo ý Bác, làm ko gộp lại thì kết quả như file con gửi vậy mới đúng nè Bac SA ơi.
Dòng màu đỏ là đúng rùi.
heocon ko muốn có nút Button Bác SA à. Nếu Sheet Data co dữ liệu thì cập nhật sang Sheet Hoa Don.

Cám ơn Bác nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
2 Nếu theo ý Bác, làm ko gộp lại thì kết quả như file con gửi vậy mới đúng nè Bac SA ơi.
2 heocon ko muốn có nút Button Bác SA à. Nếu Sheet Data co dữ liệu thì cập nhật sang Sheet Hoa Don. Cám ơn Bác nhiều.

1: Chép toàn bộ 2 code này thay hết vô 2 macro cũ;
( Các dòng lệnh có số là những dòng lệnh đã thêm hay thay đổi).
2: Không muốn nút lệnh thì bỏ đi; Tạo lại tổ hợp phím nóng;
Khi đó muốn chép thì nhấn tổ hợp phím nóng đã gán;
Chúc vui!

PHP:
Option Explicit
 Dim Solg As Byte:                              Dim DonGia As Double
 Dim HTrinh As String, SoVe As String
 

Sub SearchData()
 Dim lRow As Long, jW As Long
 
 Sheets("HOA DON").Range("A2:E" & ([A65432].End(xlUp).Row + 9)).ClearContents
 Sheets("Data").Select:                         lRow = [A65432].End(xlUp).Row
 SoVe = [A2]
 For jW = 2 To lRow
    With Range("B" & jW)
        Select Case .Value
        Case ""
            If Solg = 0 Then
                Solg = 1:                       SoVe = .Offset(, -1)
                DonGia = .Offset(, 2):          HTrinh = .Offset(, 3)
                If .Offset(1) <> "" Then
1                    HTrinh = Left(HTrinh, 1) & " " & Right(HTrinh, 1)
                    CopyTo SoVe, HTrinh, Solg, DonGia
                End If
            Else
                Solg = Solg + 1:
                If .Offset(1) <> "" Then
                    SoVe = SoVe & "-" & Right$(.Offset(, -1), 3)
                    
                    CopyTo SoVe, HTrinh, Solg, DonGia
                    
                End If
            End If
        Case Is <> ""
            If IsNumeric(.Value) Then
2                HTrinh = HTrinh & Left(.Offset(, 3), 1) & " " & Right(.Offset(, 3), 1)
                
                SoVe = SoVe & "-" & Str(.Value)
                CopyTo SoVe, HTrinh, Solg, DonGia
                
            Else
                If Left(.Value, 1) = "_" Then
                    SoVe = .Offset(, -1):       Solg = .Offset(, 1)
                    DonGia = .Offset(, 2)
3                    HTrinh = Left(.Offset(, 3), 1) & " "
                Else
4                    HTrinh = HTrinh & Left(.Offset(, 3), 1) & " "
                End If
                
                
            End If
        End Select
    End With
 Next jW
End Sub

PHP:
Sub CopyTo(SoVe As String, HTrinh As String, Solg As Byte, DonGia As Double)
 Dim lRow1 As Long:             Dim TTien As Double
 
 lRow1 = Sheets("HOA DON").Range("A65432").End(xlUp).Row + 1
 Sheets("HOA DON").Range("A" & lRow1) = SoVe
 Sheets("HOA DON").Range("B" & lRow1) = HTrinh
 Sheets("HOA DON").Range("C" & lRow1) = Solg
 TTien = DonGia * Solg:                     Solg = 0
 Sheets("HOA DON").Range("D" & lRow1) = DonGia
 Sheets("HOA DON").Range("E" & lRow1) = TTien

End Sub
 
Upvote 0
2: Không muốn nút lệnh thì bỏ đi; Tạo lại tổ hợp phím nóng;
Khi đó muốn chép thì nhấn tổ hợp phím nóng đã gán;

Ko dùng button cũng ko dùng phím gán Bác ạ. Ý con là muốn nó tự động chép sang lun.
Bac gửi file cho heocon nhé.
Chiều nay con thất hứa, con sẽ bù hôm sau nhé.
Chúc Bác luôn khỏe mạnh.
Thân!
 
Upvote 0
Chưa thấy quan tài, chưa đổ lệ!

Ko dùng button cũng ko dùng phím gán Bác ạ. Ý con là muốn nó tự động chép sang lun. Bac gửi file cho heocon nhé.
Chiều nay con thất hứa, con sẽ bù hôm sau nhé.Chúc Bác luôn khỏe mạnh.
Thân!
Tới đây mà xem trước đi: http://www.giaiphapexcel.com/forum/showthread.php?p=64963#post64963 Nhất là #13 í!
Rồi mới nói tiếp, là nên như thế nào!
 
Upvote 0
Nếu 2 vé nối giống nhau về hành trình thì gộp lại 1 dòng. Còn # nhau thì để 2 dòng. Con cám ơn Bác đã giúp đở ;;;;;;;;;;;

Kiểm tra kỹ trong file đính kèm sẽ thấy đúng yêu cầu rồi đó nha:
Xét kỹ các records có các mũi tên nha!
PHP:
Option Explicit
 Dim Solg As Integer:                              Dim DonGia As Double
 Dim HTrinh As String, SoVe As String

Sub SearchData()
 Dim lRow As Long, jW As Long
 Dim bDem As Byte, bCap As Byte
 Dim sCap As String

 Sheets("HOA DON").Range("A2:E" & ([A65432].End(xlUp).Row + 9)).ClearContents
 Sheets("Data").Select:                         lRow = [A65432].End(xlUp).Row
 SoVe = [A2]
 For jW = 2 To lRow + 1
    With Range("B" & jW)
        Select Case .Value
        Case ""
            If Solg = 0 Then
                Solg = 1:                       SoVe = .Offset(, -1)
                DonGia = .Offset(, 2):          HTrinh = .Offset(, 3)
                If .Offset(1) <> "" Then
                    HTrinh = Left(HTrinh, 1) & " " & Right(HTrinh, 1)
1                    CopyTo SoVe, HTrinh, Solg, DonGia
                End If
            Else
                Solg = Solg + 1:
                If .Offset(1) <> "" Then
                    SoVe = SoVe & "-" & Right$(.Offset(, -1), 3)
2                    CopyTo SoVe, HTrinh, Solg, DonGia
                End If
            End If
        Case Is <> ""
            If IsNumeric(.Value) Then
                HTrinh = HTrinh & Left(.Offset(, 3), 1) & " " & Right(.Offset(, 3), 1)
                bDem = 1 + bDem
                For bCap = 1 To bDem
                    If bCap < bDem Then
                        sCap = sCap & Left(.Offset(bCap, 3), 1) & " "
                    Else
                        sCap = sCap & Left(.Offset(bCap, 3), 1) & " " & _
                            Right(.Offset(bCap, 3), 1)
                    End If
                Next bCap
                If HTrinh <> sCap Then
                    SoVe = SoVe & "-" & Right$(.Offset(, -1), 3)
3                    CopyTo SoVe, HTrinh, Solg, DonGia
                Else
4                    SoVe = SoVe & "-" & Right(.Offset(bDem, -1), 3)
                    CopyTo SoVe, HTrinh, 2 * Solg, DonGia
                    jW = jW + bDem:                 Solg = 0
                End If
                
                sCap = "":              bDem = 0
            Else
                bDem = bDem + 1
                If Left(.Value, 1) = "_" Then
                    SoVe = .Offset(, -1):       Solg = .Offset(, 1)
                    DonGia = .Offset(, 2)
                    HTrinh = Left(.Offset(, 3), 1) & " "
                Else
                    HTrinh = HTrinh & Left(.Offset(, 3), 1) & " "
                End If
            End If
        End Select
    End With
 Next jW
End Sub

PHP:
Sub CopyTo(SoVe As String, HTrinh As String, ByVal Solg As Integer, DonGia As Double)
 Dim lRow1 As Long:             Dim TTien As Double
 
 lRow1 = Sheets("HOA DON").Range("A65432").End(xlUp).Row + 1
 Sheets("HOA DON").Range("A" & lRow1) = SoVe
 Sheets("HOA DON").Range("B" & lRow1) = HTrinh
 Sheets("HOA DON").Range("C" & lRow1) = Solg
 TTien = DonGia * Solg:                     Solg = 0
 Sheets("HOA DON").Range("D" & lRow1) = DonGia
 Sheets("HOA DON").Range("E" & lRow1) = TTien

End Sub
 

File đính kèm

Upvote 0
Có khi cái này là nút quan trọng đây!

1*/ Ko dùng button cũng ko dùng phím gán Bác ạ. Ý con là muốn nó tự động chép sang lun.
2*/ Bac gửi file cho heocon nhé.
Thân!
Quan trọng đến nổi, không làm rõ trước, lại lẫn quẫn & trở thành dã tràng, công toi không chừng?
Heo Con nói trình tự công việc yêu cầu rõ hơn đi, một lần nữa;
1*1 Chép tự động sang hóa đơn là sao?
Có phải tìm ra 1 trường hợp vé (bất kỳ 1 trong 3 trường hợp: Vé lẽ, vế nối đơn & vé nối đôi) thì chuyển sang form [hóa đơn] dữ liệu tìm được để in;
Sau khi in xong 1 hóa đơn thì tìm tiếp trường hợp kế tiếp, lại in. . . . . Có phải công việc lặp lại hoài vậy không đó!?
1*2 Vé nối có khi nào 3, 4. . . người đi chung tuyến nối lại không?? Thấy trong ví dụ chỉ nối hai;
1*3 Dữ liệu bên file Data sẽ được file phần mền khác cập nhật theo từng đợt hay sao?

2*1 Đã nhận được file của HeoCon rồi; Hiện tại vẫn thực hiện song song 2 file;
Đến khi nào xong macro sẽ chuyển lại file gốc cho HeoCon, yên tâm về vấn đề này nha!

Chờ ý kiến của heoCon, nhất là vấn đề 1*1
 
Lần chỉnh sửa cuối:
Upvote 0
1*1 Chép tự động sang hóa đơn là sao?
Nghĩa là khi Sheet Data có dữ liệu thì Sheet Hoa Don sẽ có dữ liệu đã được tính toán.

Sau khi in xong 1 hóa đơn thì tìm tiếp trường hợp kế tiếp, lại in. . . . . Có phải công việc lặp lại hoài vậy không đó!?

Dạ không phải như vậy, mà tìm 1 lần cho tất cả các trường hợp.
Tất cả các trường hợp được nằm trong 1 Hóa Đơn. Sau khi in xong Sheet data sẽ được đổ dữ liệu # vào và tiếp tục in Hóa Đơn #.

1*2 Vé nối có khi nào 3, 4. . . người đi chung tuyến nối lại không?? Thấy trong ví dụ chỉ nối hai;
Có chứ ạ. Có khi 10 người cũng có.

1*3 Dữ liệu bên file Data sẽ được file phần mền khác cập nhật theo từng đợt hay sao?
theo từng đợt là sao ạ?

2*1 Đã nhận được file của HeoCon rồi; Hiện tại vẫn thực hiện song song 2 file;
Đến khi nào xong macro sẽ chuyển lại file gốc cho HeoCon, yên tâm về vấn đề này nha!

Heo con Cám ơn Bác Sa rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom