Hỏi: dòng Workbooks.Open không chạy?

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

MỹHạnhCB

Đi mây, về gió. !!!
Tham gia
25/3/22
Bài viết
123
Được thích
18
Xin chào các anh chị GPE
Em đang mò mẩm tạo Function.
Mục đích là khi nhập =thunghiem(D11,U12:U13). Thì sẽ mở đến từng files ở ô U12 và U13. Lấy thông số ngay tại ô D11 files U12 sau đó cộng cho thông số ô D11 filse U13, đến khi hết files ạ.
Thì khi chạy đến dòng Workbooks.Open(filepath(i)) thì không thấy động tĩnh gì luôn ạ. Em không rõ bị lỗi gì ngay chỗ này. Kính mong các anh chị giúp đỡ.
 

File đính kèm

  • hoi.zip
    56.6 KB · Đọc: 10
Lần chỉnh sửa cuối:
Xin chào các anh chị GPE
Em đang mò mẩm tạo Function.
Mục đích là khi nhập =thunghiem(D11,U12:U13). Thì sẽ mở đến từng files ở ô U12 và U13. Lấy thông số ngay tại ô D11 files U12 sau đó cộng cho thông số ô D11 filse U13, đến khi hết files ạ.
Thì khi chạy đến dòng Workbooks.Open(filepath(i)) thì không thấy động tĩnh gì luôn ạ. Em không rõ bị lỗi gì ngay chỗ này. Kính mong các anh chị giúp đỡ.
Khiếp cái Function này mà kéo kín vùng "D11:R49" thì sẽ là 39RX15C =585 lần chạy Workbooks.Open luôn nhỉ?
 
Upvote 0
Khiếp cái Function này mà kéo kín vùng "D11:R49" thì sẽ là 39RX15C =585 lần chạy Workbooks.Open luôn nhỉ?
vâng em cũng nghĩ vậy anh ạ. Nhưng em không biết lý do sao mà chạy đến dòng workbooks.open là nó lướt đi luôn. Không thấy báo lỗi cũng không thấy có gì ạ.
 
Upvote 0
Kêu réo gì vậy?
1. Workbooks.Open không thể chạy trong function
2. Truyền tham số z là range (value) lại chính là ô đang được tính D11. Lúc đó z = 0,
ThisWorkbook.Sheets(shs).Range(z) = ThisWorkbook.Sheets(shs).Range(0). Xét code bên dưới thì phải truyền là chuỗi "D11"
3. Khai báo mảng 1 chiều filepath(30), cho k = 1 mà gán giá trị cho filepath(k)
4. Set wbs bằng cái này, wss bằng cái kia rồi không xài, xài wb và ws là 2 biến chưa khai báo và chưa có giá trị
5. Tinh giá trị của tong, gán cho SumEdit (SumEdit là cái quái gì?)
6. Gán tiếp getsum = sum: 2 cái quái gì đây nữa?
7. wb.Close Flase: wb chưa có giá trị (xem 4), và flase nghĩa là gì?
8. Tên hàm là thunghiem, vậy cuối cùng thunghiem có giá trị chưa?

Chỉ riêng mục số 1 là đã ngưng toàn bộ rồi. Nếu chuyển thành Sub thì mới bị 7 lỗi còn lại.
 
Lần chỉnh sửa cuối:
Upvote 0
. . . . . .. Nhưng em không biết lý do sao mà chạy đến dòng workbooks.open là nó lướt đi luôn. Không thấy báo lỗi cũng không thấy có gì ạ.
Nó có thể lướt qua luôn vì nó không ưa phong cách viết Code của bạn đó thôi!
Bạn thử viết 1 cách chân phương & tường minh nhất xem sao
& mình nhắn thêm 1 điều là nên bãy lỗi trong bất cứ trường hợp nào


Chí ít nên là vầy:
PHP:
Function ThuNghiem(Z As String, X As Range)
 Dim FilePath(30) As String
 Dim WBs As Workbook, wSs As Worksheet
 Dim fSo As Object, Name As String
 Dim Shs As String, rng As String, Tong&, Rn As Variant
 
 On Error GoTo ThongBao
 Application.EnableEvents = False
 Application.AskToUpdateLinks = False
 Application.DisplayAlerts = False
 Application.ScreenUpdating = False
1 Shs = ThisWorkbook.ActiveSheet.Name
'     rng = Replace(ActiveCell.Address, "$", "")
    i = 1:                  k = 1
3 For Each Rn In X
    FilePath(k) = Rn
5    k = k + 1
 Next Rn
7 While FilePath(i) <> ""
    Set WBs = Workbooks.Open(FilePath(i))
9   Set wSs = WBs.Sheets(Shs)
    wSs.Select
11  If ThisWorkbook.Sheets(Shs).Range(Z) = "" Then
        Tong = ws.Range(Z).Value
13   Else
        Tong = ThisWorkbook.Sheets(Shs).Range(Z) + wSs.Range(Z)
15    End If
    WBs.Close Flase
17    i = i + 1
 Wend
ThuNghiem = Tong
LoiCT:              Exit Function
ThongBao:
 MsgBox Error, , Erl
 Resume LoiCT
End Function

TNB.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Một số lệnh sẽ không chạy trong một function, như trường hợp của bạn, cũng giống như cố gắng dùng funtion để thay đổi màu nền của ô.
vâng, cám ơn chị nhiều
Bài đã được tự động gộp:

Kêu réo gì vậy?
1. Workbooks.Open không thể chạy trong function
2. Truyền tham số z là range (value) lại chính là ô đang được tính D11. Lúc đó z = 0,
ThisWorkbook.Sheets(shs).Range(z) = ThisWorkbook.Sheets(shs).Range(0). Xét code bên dưới thì phải truyền là chuỗi "D11"
3. Khai báo mảng 1 chiều filepath(30), cho k = 1 mà gán giá trị cho filepath(k)
4. Set wbs bằng cái này, wss bằng cái kia rồi không xài, xài wb và ws là 2 biến chưa khai báo và chưa có giá trị
5. Tinh giá trị của tong, gán cho SumEdit (SumEdit là cái quái gì?)
6. Gán tiếp getsum = sum: 2 cái quái gì đây nữa?
7. wb.Close Flase: wb chưa có giá trị (xem 4), và flase nghĩa là gì?
8. Tên hàm là thunghiem, vậy cuối cùng thunghiem có giá trị chưa?

Chỉ riêng mục số 1 là đã ngưng toàn bộ rồi. Nếu chuyển thành Sub thì mới bị 7 lỗi còn lại.
Vâng, cám ơn anh nhiều. Có thể em gửi nhầm file ạ. Gút lại thì Workbooks.Open không chạy trong function là chốt hạ rồi. hehe
Bài đã được tự động gộp:

Nó có thể lướt qua luôn vì nó không ưa phong cách viết Code của bạn đó thôi!
Bạn thử viết 1 cách chân phương & tường minh nhất xem sao
& mình nhắn thêm 1 điều là nên bãy lỗi trong bất cứ trường hợp nào


Chí ít nên là vầy:
PHP:
Function ThuNghiem(Z As String, X As Range)
 Dim FilePath(30) As String
 Dim WBs As Workbook, wSs As Worksheet
 Dim fSo As Object, Name As String
 Dim Shs As String, rng As String, Tong&, Rn As Variant
 
 On Error GoTo ThongBao
 Application.EnableEvents = False
 Application.AskToUpdateLinks = False
 Application.DisplayAlerts = False
 Application.ScreenUpdating = False
1 Shs = ThisWorkbook.ActiveSheet.Name
'     rng = Replace(ActiveCell.Address, "$", "")
    i = 1:                  k = 1
3 For Each Rn In X
    FilePath(k) = Rn
5    k = k + 1
 Next Rn
7 While FilePath(i) <> ""
    Set WBs = Workbooks.Open(FilePath(i))
9   Set wSs = WBs.Sheets(Shs)
    wSs.Select
11  If ThisWorkbook.Sheets(Shs).Range(Z) = "" Then
        Tong = ws.Range(Z).Value
13   Else
        Tong = ThisWorkbook.Sheets(Shs).Range(Z) + wSs.Range(Z)
15    End If
    WBs.Close Flase
17    i = i + 1
 Wend
ThuNghiem = Tong
LoiCT:              Exit Function
ThongBao:
 MsgBox Error, , Erl
 Resume LoiCT
End Function

View attachment 286598
Vâng cám ơn anh đã chỉ bảo. Xin rút kinh nghiệm ạ.
 
Upvote 0
Có thể em gửi nhầm file ạ.
Nhầm gì mà nhầm, tôi nghĩ là không nhầm file. Code đã viết xong, không chạy, lỗi đúng chỗ đó. Chả lẽ có file khác ít lỗi cú pháp hơn hay file mới không có lỗi cú pháp nào?
Bạn thử viết 1 cách chân phương & tường minh nhất xem sao
Tong = ws.Range(Z).Value
...
WBs.Close Flase
Anh vẫn xài 1 biến ws chưa có giá trị, và vẫn dùng Flase. Đồng thời function không chạy lệnh Workbooks.Open, ráng sửa làm gì.
 
Upvote 0
Nếu khai báo Option Explicit đầu module thì đã dễ dàng thấy nhiều chỗ sai rồi. Viết code vba mà cứ dùng biến kiểu ưa đâu dùng đó thì chỉ khổ về sau thôi.
 
Upvote 0
Dẫn ra cái macro đó ngỏ hầu đề nghị chủ bài đăng luôn bãy lỗi mà thôi;
Còn những gì khác thì chỉnh tẹo cho dễ đọc Code mà thôi;
Thực sự mình không có đủ khả năng đáp ứng các yêu cầu của bài này!
 
Upvote 0
Thực sự mình không có đủ khả năng đáp ứng các yêu cầu của bài này!
Chuyển thành sub (có tham số) và sửa 7 lỗi còn lại là chạy, bắt lỗi càng tốt, nhưng khả năng lỗi hơi hiếm. Nếu có (chẳng hạn file định mở không tồn tại) thì cứ đọc thông báo lỗi của nó.
 
Upvote 0
Vâng ạ, em cảm ơn những góp ý của các anh chị. Thì sao khi em đổi sang sub thì cũng giải quyết được 1 phần công việc của em (em xin gửi files mẩu). Với khả năng cùi bơ xác mía của em thì em không dám hơn thua gì ở đây. Nhưng nếu anh chị nào có thuật toán nào khác thì mong các anh chị thị phạm để em được học hỏi thêm kinh nghiệm ạ.
Em xin chân thành cảm ơn.
Bài đã được tự động gộp:

À quên em có mượn 1 phần (code) bẫy lỗi của anh SA_DQ ạ. Xin cám ơn anh
 

File đính kèm

  • thongke.zip
    299.1 KB · Đọc: 6
Upvote 0
. . . . .
À quên em có mượn 1 phần (code) bẫy lỗi của anh SA_DQ ạ. Xin cám ơn anh
Bạn cần chú ý chuyện nhỏ này:
PHP:
'. . .    "
LoiCT:                          Exit Sub
ThongBao:
 MsgBox Error, , Erl
 Resume LoiCT
    Application.AskToUpdateLinks = True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Erl là 1 hàm của VBA, nó sẽ trả về dòng đang gây lỗi;
Muốn xài hàm này ta cần đánh số cho các dòng lệnh (Có thể đánh cách quảng)
Có vậy ta mới biết dòng (lệnh) nào đang lỗi.
Chứ nếu không 'quánh số' các dòng lệnh, thì VBE sẽ báo là Rrl()=0 → như không!
 
Upvote 0
Bạn cần chú ý chuyện nhỏ này:
PHP:
'. . .    "
LoiCT:                          Exit Sub
ThongBao:
 MsgBox Error, , Erl
 Resume LoiCT
    Application.AskToUpdateLinks = True
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Erl là 1 hàm của VBA, nó sẽ trả về dòng đang gây lỗi;
Muốn xài hàm này ta cần đánh số cho các dòng lệnh (Có thể đánh cách quảng)
Có vậy ta mới biết dòng (lệnh) nào đang lỗi.
Chứ nếu không 'quánh số' các dòng lệnh, thì VBE sẽ báo là Rrl()=0 → như không!
À vâng em rõ rồi ạ. Cám ơn anh nhiều
 
Upvote 0
Với khả năng cùi bơ xác mía của em thì em không dám hơn thua gì ở đây. Nhưng nếu anh chị nào có thuật toán nào khác thì mong các anh chị thị phạm để em được học hỏi thêm kinh nghiệm ạ.
Không cần tối ưu, ít nhất là code chạy được ra kết quả mong muốn.
Còn muốn nâng cao kiến thức tối thiểu (chưa cần tăng tốc độ), thì ít nhất cũng đọc ở trên và sửa flase thành false, thêm Option Explicit ở trên đầu code, ...
Nâng cao hơn nữa thì không khai báo dư filepath(50), tái sử dụng rng = selection, không cần resize rn(0) làm gì, ...
 
Upvote 0
Không cần tối ưu, ít nhất là code chạy được ra kết quả mong muốn.
Còn muốn nâng cao kiến thức tối thiểu (chưa cần tăng tốc độ), thì ít nhất cũng đọc ở trên và sửa flase thành false, thêm Option Explicit ở trên đầu code, ...
Nâng cao hơn nữa thì không khai báo dư filepath(50), tái sử dụng rng = selection, không cần resize rn(0) làm gì, ...
Vâng, cám ơn sự góp ý của anh ạ
 
Upvote 0
Không cần tối ưu, ít nhất là code chạy được ra kết quả mong muốn.
Còn muốn nâng cao kiến thức tối thiểu (chưa cần tăng tốc độ), thì ít nhất cũng đọc ở trên và sửa flase thành false, thêm Option Explicit ở trên đầu code, ...
Nâng cao hơn nữa thì không khai báo dư filepath(50), tái sử dụng rng = selection, không cần resize rn(0) làm gì, ...
Với cho em hỏi là ở dòng filepath(50) của e là do files nguồn của em không cố định, lúc 30 files, lúc 50 files. Nên có cách nào để khai báo biến filepath theo số file đầu vào không ạ.
 
Upvote 0
Với cho em hỏi là ở dòng filepath(50) của e là do files nguồn của em không cố định, lúc 30 files, lúc 50 files. Nên có cách nào để khai báo biến filepath theo số file đầu vào không ạ.
Số file đầu vào tương ứng với số file chọn trong hộp thoại FileDialog. Bạn đã từng xài mà? Nó là fileExplorer.SelectedItems.Count
Vậy thì khai báo:
Dim filepath()
đặt tên fileList hay hơn.
sau khi chọn file xong:
Redim filepath(1 to fileExplorer.SelectedItems.Count)
Sau đó nữa là vòng lặp gán từng SelectedItems vào filepath

---------
Bạn cứ hỏi dần dần như thế này, sẽ có người trả lời và bạn sẽ tiến bộ thôi. Chứ bạn mà nhờ làm hết thì code tối ưu sẵn và không học được gì.
 
Lần chỉnh sửa cuối:
Upvote 0
Số file đầu vào tương ứng với số file chọn trong hộp thoại FileDialog. Bạn đã từng xài mà? Nó là fileExplorer.SelectedItems.Count
Vậy thì khai báo:
Dim filepath()
đặt tên fileList hay hơn.
sau khi chọn file xong:
Redim filepath(1 to fileExplorer.SelectedItems.Count)
Sau đó nữa là vòng lặp gán từng SelectedItems vào filepath

---------
Bạn cứ hỏi dần dần như thế này, sẽ có người trả lời và bạn sẽ tiến bộ thôi. Chứ bạn mà nhờ làm hết thì code tối ưu sẵn và không học được gì.
Vâng em hiểu rồi. Cám ơn anh nhiều. ^^^^
 
Upvote 0
Web KT

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

Back
Top Bottom