Cần giúp đỡ viết 1 Command_button_Click chạy 3 Sub VBA (1 người xem)

  • Thread starter Thread starter tungvnl
  • Ngày gửi Ngày gửi

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

tungvnl

Thành viên mới
Tham gia
27/4/08
Bài viết
26
Được thích
0
Xin chào toàn thể các Anh/Chị trong diễn đàn.
Xin các Anh/Chị giúp e yêu cầu nho nhỏ về VBA và Command_button_Click.
E có 1 file Excel abc.xls. File này có 3 Sheet A,B,C. Có 3 sub a1, sub a2, sub a3.
Hiện tại e đang phải dùng tới 3 command_button_Click a1,a2,a3.
Câu hỏi cần giúp đỡ:
Có cách nào tạo duy nhất 1 comman_button_click mà có thể chạy lần lượt 3 sub a1,a2,a3.
Mong Anh/Chị giúp đỡ.
Cảm ơn các Anh/Chị rất nhiều!
 
Xin chào toàn thể các Anh/Chị trong diễn đàn.
Xin các Anh/Chị giúp e yêu cầu nho nhỏ về VBA và Command_button_Click.
E có 1 file Excel abc.xls. File này có 3 Sheet A,B,C. Có 3 sub a1, sub a2, sub a3.
Hiện tại e đang phải dùng tới 3 command_button_Click a1,a2,a3.
Câu hỏi cần giúp đỡ:
Có cách nào tạo duy nhất 1 comman_button_click mà có thể chạy lần lượt 3 sub a1,a2,a3.
Mong Anh/Chị giúp đỡ.
Cảm ơn các Anh/Chị rất nhiều!
Chỉ vầy thôi
PHP:
Private Sub CommandButton1_Click()
          a1
          a2
          a3
End Sub
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn a @quanghai1969
E chạy ok rồi a à. A xem giúp e xem, e muốn nó chạy a1 khoảng 30 giây rùi chạy a2 30 giây rồi chạy a3.
Thời gian chạy code (nhanh/chậm) là do dữ liệu/cách viết code quyết định.. chứ sao mình điều chỉnh được
 
Upvote 0
Thời gian chạy code (nhanh/chậm) là do dữ liệu/cách viết code quyết định.. chứ sao mình điều chỉnh được
Cách của @quanghai19ạy chạy rất tốt, nhưng e muốn hỏi thêm là muốn nó chạy xong hẳn a1 rồi mới tới a2 và xong a2 thì tới a3. Vì chạy như thế này sẽ không thể có được dữ liệu. Vi Sub a1 cần khoảng thời gian thì mới có dữ liệu cho a2.
Chạy A1 kết thúc thì mới chạy A2, A2 kết thúc thì chạy A3 (Như thế cũng được, nếu làm được thế thì tốt a @Cá ngừ F1)
 
Upvote 0
Cách của @quanghai19ạy chạy rất tốt, nhưng e muốn hỏi thêm là muốn nó chạy xong hẳn a1 rồi mới tới a2 và xong a2 thì tới a3. Vì chạy như thế này sẽ không thể có được dữ liệu. Vi Sub a1 cần khoảng thời gian thì mới có dữ liệu cho a2.
Chạy A1 kết thúc thì mới chạy A2, A2 kết thúc thì chạy A3 (Như thế cũng được, nếu làm được thế thì tốt a @Cá ngừ F1)
Viết như thế là chạy lần lượt mà bạn, xong a1 mới đến a2..., ko thể chạy song song các sub được
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Viết như thế là chạy lần lượt mà bạn, xong a1 mới đến a2..., ko thể chạy song song các sub được
Có chạy lần lượt nhưng mà nó sẽ chạy gần như cùng lúc. Vì bản thân A1 chạy phải cần ít nhất 10s mới có đủ kết quả cho A2, nhưng A3 đã cho ra kết quả khi A1 chưa chạy hết. Thế là kết quả xuất ra chưa đúng, nếu muốn đúng phải chạy lại lần 2 thì sẽ cho ra kết quả đúng nhất.
 
Upvote 0
Có chạy lần lượt nhưng mà nó sẽ chạy gần như cùng lúc. Vì bản thân A1 chạy phải cần ít nhất 10s mới có đủ kết quả cho A2, nhưng A3 đã cho ra kết quả khi A1 chưa chạy hết. Thế là kết quả xuất ra chưa đúng, nếu muốn đúng phải chạy lại lần 2 thì sẽ cho ra kết quả đúng nhất.
Tôi hiểu ý bạn!............
 
Upvote 0
============Xin lỗi tác giả=================
Tôi đọc không kỹ các bài trước hoặc do mắt kèm nhèm nên bị nhầm và tưởng rằng tác giả mong muốn bấm 1 nút và 3 thủ tục chạy đồng thời.
Giờ đọc lại thấy sai.
Xin thành thật xin lỗi các bạn. Và nếu cần thì nhờ ban quản trị xóa giùm bài này của tôi kèm các trích dẫn
============Xin lỗi các bạn=========================================================


Các bạn đụng vào vấn đề khó trong lập trình và cái này, tôi đồ rằng đó là do sự phân tích phức tạp của bài tập. Tôi không tin lắm việc xử lý dữ liệu chết (đã lưu trong bảng) lại cần phải làm phức tạp như thế. Nếu liên quan đến quản lý chu trình điều khiển máy thì yêu cầu đồng bộ, xử lý thời gian thực mới phải được đặt ra một cách chặt chẽ. Thường khi phải làm như vậy người ta phải vận dụng đến cấu hình tính toán đa nhân (nhiều bộ xử lý) hoặc phân luồng tính toán nếu không có nhiều bộ xử lý. Kiểu ứng dụng này người ta làm nhiều trong điều khiển học hoặc tính toán giả lập.

Trong trường hợp là bài toán xử lý từ số liệu đã có thì cách tốt nhất là thực hiện mang tính tuần tự. Nếu không làm được tuần tự thì cần phải có lý do xác đáng thay vì cố gắng đi vào một ngõ hẹp của khoa học máy tính. Bản thân Excel, nguyên tắc tính toán của nó cũng được thực hiện một cách tuần tự (theo kiến thức hạn hẹp mà tôi biết về các phiên bản từ 2007 trở về trước). Excel tính toán số liệu đơn nguyên sau đó mới đến các phép toán phức hợp. (Phần này nếu có sai, xin các tiền bối chỉ giáo thêm).

Từ yêu cầu của chủ topic, tôi xin đề xuất thế này:
+ Bạn nên làm mô tả rõ ràng về yêu cầu đầu bài - nếu đúng cần phải giải quyết đồng thời thì đây là một chủ đề hay về vấn đề phân luồng tính toán (threading) trong Excel - hiện tại mới thấy có trong .Net;
+ Cung cấp ví dụ và nêu rõ được sự cần thiết phải làm như vậy (tính toán đồng thời);
Sau khi có yêu cầu như vậy, mọi thứ sẽ rõ hơn đối với những người muốn có ý định trả lời, thay vì mò kim hoặc húc đầu vào đá tảng.
Tôi xin thưa thớt vài điều như vậy!
 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn đụng vào vấn đề khó trong lập trình và cái này, tôi đồ rằng đó là do sự phân tích phức tạp của bài tập. Tôi không tin lắm việc xử lý dữ liệu chết (đã lưu trong bảng) lại cần phải làm phức tạp như thế. Nếu liên quan đến quản lý chu trình điều khiển máy thì yêu cầu đồng bộ, xử lý thời gian thực mới phải được đặt ra một cách chặt chẽ. Thường khi phải làm như vậy người ta phải vận dụng đến cấu hình tính toán đa nhân (nhiều bộ xử lý) hoặc phân luồng tính toán nếu không có nhiều bộ xử lý. Kiểu ứng dụng này người ta làm nhiều trong điều khiển học hoặc tính toán giả lập.
Trong trường hợp là bài toán xử lý từ số liệu đã có thì cách tốt nhất là thực hiện mang tính tuần tự. Nếu không làm được tuần tự thì cần phải có lý do xác đáng thay vì cố gắng đi vào một ngõ hẹp của mảng máy tính.
Từ yêu cầu của chủ topic, tôi xin đề xuất thế này:
+ Bạn nên làm mô tả rõ ràng về yêu cầu đầu bài - nếu đúng cần phải giải quyết đồng thời thì đây là một chủ đề hay về vấn đề phân luồng tính toán (threading) trong Excel - hiện tại mới thấy có trong .Net;
+ Cung cấp ví dụ và nêu rõ được sự cần thiết phải làm như vậy (tính toán đồng thời);
Sau khi có yêu cầu như vậy, mọi thứ sẽ rõ hơn đối với những người muốn có ý định trả lời, thay vì mò kim hoặc húc đầu vào đá tảng.
Tôi xin thưa thớt vài điều như vậy!
Hướng dẫn của @quanghai1969 chạy ok rồi, nhưng phải chạy lần 2 nếu muốn kết quả chính xác và đầy đủ.
Xin cảm ơn các Anh/Chị rất nhiều.
Thôi e chạy 2 lần cũng không sao.
Cảm ơn rất nhiều @quanghai1969
 
Upvote 0
Vô lý quá, chắc code bạn viết sai gì đấy chứ 2 cái nút hay 1 cái nút đều như nhau
Khác nhau a à. Ý của e là E chạy nút Cmd_1 và chờ nó chạy xong thì e mới nhất nút Cmd_2
Ở đây:
A1 e có get data từ website thế nên phải connect tới website rồi mới get về, vì thế cần thêm thời gian
A2 phân tích lấy vài dữ liệu cần thiết trong data website trả về (===>Phải chạy A1 trước để có data)
A3 dựa vào kết quả của A2 trích xuất ra dữ liệu cuối cùng.
 
Upvote 0
Khác nhau a à. Ý của e là E chạy nút Cmd_1 và chờ nó chạy xong thì e mới nhất nút Cmd_2
Ở đây:
A1 e có get data từ website thế nên phải connect tới website rồi mới get về, vì thế cần thêm thời gian
A2 phân tích lấy vài dữ liệu cần thiết trong data website trả về (===>Phải chạy A1 trước để có data)
A3 dựa vào kết quả của A2 trích xuất ra dữ liệu cuối cùng.
Đúng là hơi vô lý.. 1 hay 2 nút ko khác j nhau.. a1 chạy xong tức là đã lấy đc dữ liệu về rồi.. còn nếu ko lấy đc dữ liệu thì sub a1 sẽ báo lỗi ngay.. sao sang đc đến a2
 
Upvote 0
Có chạy lần lượt nhưng mà nó sẽ chạy gần như cùng lúc. Vì bản thân A1 chạy phải cần ít nhất 10s mới có đủ kết quả cho A2, nhưng A3 đã cho ra kết quả khi A1 chưa chạy hết. Thế là kết quả xuất ra chưa đúng, nếu muốn đúng phải chạy lại lần 2 thì sẽ cho ra kết quả đúng nhất.
Các sub trong một thủ tục sẽ lần lượt thực thi từ trên xuống dưới, xong sub A1 sẽ đến A2 rồi mới thức hiện tiếp A3.

Nếu một hoặc tất cả thủ tục "con" của bạn trong quá trình chạy có ghi giá trị lên sheet, đồng thời bạn có dùng các câu lệnh tăng tốc như đại loại như Application.Calculation = xlCalculationManual, thì khi thực thi, giá trị sẽ không được tính toán. Vì thế nếu có thì bỏ chúng đi là được.
 
Upvote 0
Đúng là hơi vô lý.. 1 hay 2 nút ko khác j nhau.. a1 chạy xong tức là đã lấy đc dữ liệu về rồi.. còn nếu ko lấy đc dữ liệu thì sub a1 sẽ báo lỗi ngay.. sao sang đc đến a2
a2 lấy được dữ liệu nhưng bị thiếu, và có thể là lấy dữ liệu cũ vì không đủ thời gian cho a1 làm việc mà a2 đã chạy ngay.
E chạy rồi, và đã OK theo cách này, có điều phải tạo 2 commandbutton_click thôi.
P/S: E tập toẹ VBA nên viết không được logic, có thể do vậy nên a2 mới chạy khi a1 chưa làm xong việc.
Cái này là e đang cần nè.
 
Upvote 0
Các sub trong một thủ tục sẽ lần lượt thực thi từ trên xuống dưới, xong sub A1 sẽ đến A2 rồi mới thức hiện tiếp A3.

Nếu một hoặc tất cả thủ tục "con" của bạn trong quá trình chạy có ghi giá trị lên sheet, đồng thời bạn có dùng các câu lệnh tăng tốc như đại loại như Application.Calculation = xlCalculationManual, thì khi thực thi, giá trị sẽ không được tính toán. Vì thế nếu có thì bỏ chúng đi là được.
Có cách nào viết Sub để cái sau a2 phải kiểm tra hoặc phải chờ cho cái trước a1 chạy xong (Hiển thị ở Status Excel) không a?
Nếu có thì áp dụng được cho mấy cái Sub cùi của e.
 
Upvote 0
Có cách nào viết Sub để cái sau a2 phải kiểm tra hoặc phải chờ cho cái trước a1 chạy xong (Hiển thị ở Status Excel) không a?
Nếu có thì áp dụng được cho mấy cái Sub cùi của e.
Bạn cứ gửi cái file lên đi, chứ có biết gì đâu mà viết?

Còn không bạn sử dụng:

Application.Wait

Chẳng hạn:


Mã:
If Application.[B]Wait[/B](Now + TimeValue("0:00:10")) Then
    MsgBox "Time expired"
End If

Coi trong Help sẽ dễ dàng cho bạn.
 
Upvote 0
Bạn cứ gửi cái file lên đi, chứ có biết gì đâu mà viết?

Còn không bạn sử dụng:

Application.Wait

Chẳng hạn:


Mã:
If Application.[B]Wait[/B](Now + TimeValue("0:00:10")) Then
    MsgBox "Time expired"
End If

Coi trong Help sẽ dễ dàng cho bạn.
E đang ở ngoài, tí về e gửi file lên, a xem giúp e cái nhé.
 
Upvote 0
Thôi bài này nhường lại cái kính đen và cái mu rùa cho HTN nha. Mình không bói nổi nữa rồi.
 
Upvote 0
Bạn cứ gửi cái file lên đi, chứ có biết gì đâu mà viết?

Còn không bạn sử dụng:

Application.Wait

Chẳng hạn:


Mã:
If Application.[B]Wait[/B](Now + TimeValue("0:00:10")) Then
    MsgBox "Time expired"
End If

Coi trong Help sẽ dễ dàng cho bạn.

E gửi a cái file, a xem giúp e nhé.
Cảm ơn a
Lưu ý: Sheets(Thongtin) Phải hiển thị đầy đủ cả Sheets (A) và (B) a nhé.
Chắc là e làm sai gì thôi. Đây là file e gửi a
View attachment Lich_Bongda.xls
 
Upvote 0
E gửi a cái file, a xem giúp e nhé.
Cảm ơn a
Lưu ý: Sheets(Thongtin) Phải hiển thị đầy đủ cả Sheets (A) và (B) a nhé.
Chắc là e làm sai gì thôi. Đây là file e gửi a
View attachment 125570

Cho tôi hỏi, câu lệnh này đã đúng địa chỉ chưa?

Sheets("B").Range("a1:d80").copy Worksheets("Thongtin").Range("A1:k80")

Vả lại, khi nối tiếp nhau phải bắt đầu từ ô A81 mới đúng chứ không phải thế này:

Sheets("C").Range("a1:k50").copy Worksheets("Thongtin").Range("a80:k200")

Theo tôi thì bạn sửa như thế này:

Mã:
Sub A2()
    'Transfer data
    Sheets("B").Range("A1:[COLOR=#ff0000][B]D80[/B][/COLOR]").copy Sheets("Thongtin").Range("A1")
    ''Transfer data
    Sheets("C").Range("A1:K50").copy _
    Sheets("Thongtin").Range("A" & Rows.Count).End(xlUp).Offset(1)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cho tôi hỏi, câu lệnh này đã đúng địa chỉ chưa?

Sheets("B").Range("a1:d80").copy Worksheets("Thongtin").Range("A1:k80")

Vả lại, khi nối tiếp nhau phải bắt đầu từ ô A81 mới đúng chứ không phải thế này:

Sheets("C").Range("a1:k50").copy Worksheets("Thongtin").Range("a80:k200")

Theo tôi thì bạn sửa như thế này:

Mã:
Sub A2()
    'Transfer data
    Sheets("B").Range("A1:[COLOR=#ff0000][B]D80[/B][/COLOR]").copy Sheets("Thongtin").Range("A1")
    ''Transfer data
    Sheets("C").Range("A1:K50").copy _
    Sheets("Thongtin").Range("A" & Rows.Count).End(xlUp).Offset(1)
End Sub
Cái này là có thay đổi đó a, vd: Khi kết quả B nhiều hơn nữa thì Thongtin sẽ bị kéo dài ra. Chỉ là tương đối thôi a.
E không cần chính xác, vì khoảng RANGE mình có thể thay đổi khi dữ liệu nhiều hơn và phải thêm rows, e sẽ thêm thủ công.
 
Upvote 0
Mã:
Sheets("C").Range("A1:K50").copy _
    Sheets("Thongtin").Range("A" & Rows.Count).End(xlUp).Offset(1)
Thay cái này vào không chạy được a à.
Cho tôi hỏi, câu lệnh này đã đúng địa chỉ chưa?

Sheets("B").Range("a1:d80").copy Worksheets("Thongtin").Range("A1:k80")

Vả lại, khi nối tiếp nhau phải bắt đầu từ ô A81 mới đúng chứ không phải thế này:

Sheets("C").Range("a1:k50").copy Worksheets("Thongtin").Range("a80:k200")

Theo tôi thì bạn sửa như thế này:

Mã:
Sub A2()
    'Transfer data
    Sheets("B").Range("A1:[COLOR=#ff0000][B]D80[/B][/COLOR]").copy Sheets("Thongtin").Range("A1")
    ''Transfer data
    Sheets("C").Range("A1:K50").copy _
    Sheets("Thongtin").Range("A" & Rows.Count).End(xlUp).Offset(1)
End Sub
 
Upvote 0
Mã:
Sheets("C").Range("A1:K50").copy _
    Sheets("Thongtin").Range("A" & Rows.Count).End(xlUp).Offset(1)
Thay cái này vào không chạy được a à.
Tôi hiểu rồi, lý do đơn giản là dữ liệu tại các sheet là công thức, vì thế khi copy nó cũng copy công thức. Bạn phải copy và paste value nó mới thực hiện được!

Mã:
Sub TongHop()
[COLOR=#0000ff]    ''Sub A1[/COLOR]
    ActiveWorkbook.RefreshAll
[COLOR=#0000ff]    ''Sub A2[/COLOR]
    With Sheets("Thongtin")
        .Range("A:K").Clear
        With Sheets("B")
            Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Copy
        End With
[COLOR=#ff0000]        .Range("A1").PasteSpecial xlPasteValues[/COLOR]
        With Sheets("C")
            Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Copy
        End With
[COLOR=#ff0000]        .Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues[/COLOR]
[COLOR=#0000ff]    ''Sub A3[/COLOR]
        .Copy
        ActiveWorkbook.SaveAs _
            Filename:="C:\Thongtin.csv", _
            FileFormat:=xlCSV, _
            CreateBackup:=False
    End With
End Sub
 
Upvote 0
À, khi kiểm tra lại tôi mới để ý thấy bạn dùng QueryTable (lich-thi-dau-bong-da-hom-nay-c287a364371 và livescore.bongdaplus.vn). Vì thế bạn mới cho Refresh để copy dữ liệu từ Web vào sheet.

Cái thời gian thực hiện copy này mất nhiều thời gian hay không tùy thuộc vào đường truyền, vì thế, theo tôi bạn nên làm 2 động tác. Động tác thứ nhất cho Refresh dữ liệu, sau khi đã copy xong thì bạn chạy động tác 2 là copy dữ liệu qua sheet thông tin và tạo file mới.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi hiểu rồi, lý do đơn giản là dữ liệu tại các sheet là công thức, vì thế khi copy nó cũng copy công thức. Bạn phải copy và paste value nó mới thực hiện được!

Mã:
Sub TongHop()
[COLOR=#0000ff]    ''Sub A1[/COLOR]
    ActiveWorkbook.RefreshAll
[COLOR=#0000ff]    ''Sub A2[/COLOR]
    With Sheets("Thongtin")
        .Range("A:K").Clear
        With Sheets("B")
            Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Copy
        End With
[COLOR=#ff0000]        .Range("A1").PasteSpecial xlPasteValues[/COLOR]
        With Sheets("C")
            Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Copy
        End With
[COLOR=#ff0000]        .Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues[/COLOR]
[COLOR=#0000ff]    ''Sub A3[/COLOR]
        .Copy
        ActiveWorkbook.SaveAs _
            Filename:="C:\Thongtin.csv", _
            FileFormat:=xlCSV, _
            CreateBackup:=False
    End With
End Sub
Chưa khả thi a à, vẫn phải lấy lần thứ 2 mới có đủ dữ liệu cho thông tin.
A tải file này về rồi thử lại xem fix được giúp e không nhé. File ở bên dưới:

E phải làm như thế này mới có được kết quả như ý nè a:
Lần đâu: Khi nhấn command (Lay du lieu bong) (Sub a1 sẽ chạy để refreshall get dữ liệu từ web), sheets B,C sẽ lấy dữ liệu từ A. Cùng thời gian Sub a1 chạy thì Sub a2 cũng chạy để chuyển dữ liệu B,C sang Thongtin. Do Sub a1 chạy chưa xong mà Sub a2 đã chạy nên dữ liệu sheets Thongtin bị thiếu.====>File thongtin.csv bị thiếu nội dung/

Lần hai: Không tắt excel đi (Chỉ tắt file thongtin.csv vừa lưu), nhấn lại command (Lay du lieu bong) thì kết quả thành công như mong đợi.

Gửi a file mẫu sau khi thay Sub a đưa:
View attachment Lich_Bongda.xls
 
Upvote 0
À, khi kiểm tra lại tôi mới để ý thấy bạn dùng QueryTable (lich-thi-dau-bong-da-hom-nay-c287a364371 và livescore.bongdaplus.vn). Vì thế bạn mới cho Refresh để copy dữ liệu từ Web vào sheet.

Cái thời gian thực hiện copy này mất nhiều thời gian hay không tùy thuộc vào đường truyền, vì thế, theo tôi bạn nên làm 2 động tác. Động tác thứ nhất cho Refresh dữ liệu, sau khi đã copy xong thì bạn chạy động tác 2 là copy dữ liệu qua sheet thông tin và tạo file mới.
Chính xác, đúng ý của e luôn nè a.
Giờ chỉ còn cách là cho cái a2 và a3 nó dừng sau khi a1 chạy xong thì may ra ổn hơn.

Giờ e đang phải làm 2 command_click()
Mã:
[COLOR=#007700][FONT=monospace][I]Private [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Sub Cmd1[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]()
[/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]a1
End Sub 


[/I][/FONT][/COLOR]

Mã:
[COLOR=#007700][FONT=monospace][I]Private [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Sub Cmd2[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]()
[/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]a2
a3
End Sub 
[/I][/FONT][/COLOR]

Chạy Cmd1 xong hẳn, e mới chạy Cmd2. Kết quả ok luôn a à. hi
Cảm ơn a đá giúp đỡ.
 
Upvote 0
Chưa khả thi a à, vẫn phải lấy lần thứ 2 mới có đủ dữ liệu cho thông tin.
A tải file này về rồi thử lại xem fix được giúp e không nhé. File ở bên dưới:

E phải làm như thế này mới có được kết quả như ý nè a:
Lần đâu: Khi nhấn command (Lay du lieu bong) (Sub a1 sẽ chạy để refreshall get dữ liệu từ web), sheets B,C sẽ lấy dữ liệu từ A. Cùng thời gian Sub a1 chạy thì Sub a2 cũng chạy để chuyển dữ liệu B,C sang Thongtin. Do Sub a1 chạy chưa xong mà Sub a2 đã chạy nên dữ liệu sheets Thongtin bị thiếu.====>File thongtin.csv bị thiếu nội dung/

Lần hai: Không tắt excel đi (Chỉ tắt file thongtin.csv vừa lưu), nhấn lại command (Lay du lieu bong) thì kết quả thành công như mong đợi.

Gửi a file mẫu sau khi thay Sub a đưa:
View attachment 125614
Bạn nên làm 2 động tác thôi:

Động tác đầu tiên (bấm nút Lay Du Lieu Bong):

Mã:
Sub RefreshData()
    Sheets("A").Cells.ClearContents
    ActiveWorkbook.RefreshAll
End Sub

Sau khi dữ liệu đã được cập nhật toàn bộ thì Động tác thứ 2 là bấm nút Copy Du Lieu:

Mã:
Sub RunCopy()
    With Sheets("Thongtin")
        .Range("A:K").Clear
        With Sheets("B")
            Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Copy
        End With
        .Range("A1").PasteSpecial xlPasteValues
        With Sheets("C")
            Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Copy
        End With
        .Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues
        .Copy
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs _
            Filename:="C:\Thongtin.csv", _
            FileFormat:=xlCSV, _
            CreateBackup:=False
[COLOR=#ff0000]        ''Neu muon dong file moi sau khi file duoc tao:[/COLOR]
        ActiveWorkbook.Close
    End With
End Sub

Có như thế thì mới được mà thôi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
.Copy
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs _
Filename:="C:\Thongtin.csv", _
FileFormat:=xlCSV, _
CreateBackup:=False
''Neu muon dong file moi sau khi file duoc tao:
ActiveWorkbook.Close
End With
End Sub
[/CODE]

Có như thế thì mới được mà thôi.

E muốn đóng luôn Sheets(Thongtin) sau khi đã copy và lưu có được không a? Chỉ để lại Sheets A,B,C. Không phải đóng cả file excel.
 
Upvote 0
E muốn đóng luôn Sheets(Thongtin) sau khi đã copy và lưu có được không a? Chỉ để lại Sheets A,B,C. Không phải đóng cả file excel.
Tôi nghĩ bạn có cần Sheet B và C hay không vì khi thực hiện code ta không cần 2 sheet này làm trung gian. Ta copy trực tiếp từ sheet A vào sheet ThongTin luôn, làm chi thêm 2 sheet đó cho nặng file!
 
Upvote 0
Nếu là tôi thì tôi làm như thế này:

1) Xóa bỏ 2 sheet thừa B và C

2) Code cập nhật:

Mã:
Sub RefreshData()
    Application.ScreenUpdating = False
    Sheets("A").Cells.ClearContents
    ActiveWorkbook.RefreshAll
    Application.ScreenUpdating = True
End Sub

3) Code Copy:

Mã:
Sub RunCopy()
    Dim r As Long
    Dim Bang1 As Range, Bang2 As Range
    Application.ScreenUpdating = False
    With Sheets("A").UsedRange
        Set Bang1 = .Resize(, 4)
        Set Bang2 = .Offset(, 9).Resize(, 11)
    End With
    With Sheets("Thongtin")
        .Visible = xlSheetVisible
        .Range("A:K").Clear
        Bang1.Copy .Range("A1")
        r = .UsedRange.Rows.Count + 1
        Bang2.Copy .Range("A" & r)
        .Copy
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs _
            Filename:="C:\Thongtin.csv", _
            FileFormat:=xlCSV, _
            CreateBackup:=False
        ''----------------------------
        ''Neu muon dong file moi:
        ActiveWorkbook.Close
        ''----------------------------
        Application.DisplayAlerts = True
        .Visible = xlSheetVeryHidden
    End With
    Application.ScreenUpdating = True
End Sub


Chỉ vậy thôi.
 

File đính kèm

Upvote 0
a2 lấy được dữ liệu nhưng bị thiếu, và có thể là lấy dữ liệu cũ vì không đủ thời gian cho a1 làm việc mà a2 đã chạy ngay.
E chạy rồi, và đã OK theo cách này, có điều phải tạo 2 commandbutton_click thôi.
P/S: E tập toẹ VBA nên viết không được logic, có thể do vậy nên a2 mới chạy khi a1 chưa làm xong việc.
Cái này là e đang cần nè.
ban thử vầy xem đúng hay sai nha
Sub a1()
with sheet...
'code
End with
a2
end sub

Sub a2()
with sheet...
'code
End with
a3
end sub
 
Upvote 0
Tôi nghĩ bạn có cần Sheet B và C hay không vì khi thực hiện code ta không cần 2 sheet này làm trung gian. Ta copy trực tiếp từ sheet A vào sheet ThongTin luôn, làm chi thêm 2 sheet đó cho nặng file!
Hoàn hảo rồi a à. hì cảm ơn a nhiều nha. Giờ chỉ có mình sheets A. gọn nhẹ. E làm máy móc nên phải thế. hì
 
Upvote 0
A thông cảm, e gà VBA lắm, a viết thế e chịu. Có thời gian a viết hết luôn ra các Sub giúp e. Có file đính kèm đó a.
Mình nghĩ nếu bạn mới làm quen Với VBA thì bạn tách ra ba sub để dễ hiểu và thên bớt code sau này khi nào code giỏi thì gộp lại là ok
theo như trên thì bạn chỉ cần chạy sub a1 xong sub a2 chạy tiếp xong đến sub a3 chạy cuối cùng .vậy là theo yêu cầu ban đầu của bạn rồi đó."Cần giúp đỡ viết 1 Command_button_Click chạy 3 Sub VBA"

Private Sub Cmd1()
a1
End Sub
 
Upvote 0

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

Back
Top Bottom