Chuyên đề giải đáp những thắc mắc về code VBA

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,007
Được thích
15,548
Điểm
1,860
Tuổi
60
Nơi ở
An Giang
biến a là các gia trị trong mảng total, không biết em làm thế có đúng các không ạ?
Bạn đưa file lên và giải thích bạn muốn kết quả là gì mọi người mới hiểu được.
Code bạn viết chỉ bạn hiểu mục đích thôi.
 

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
Tối kỵ trong lập trình là dùng biến mà chưa khởi tạo trị mặc định ban đầu cho nó. Ông VBA này lanh chanh quá, làm người code dễ dãi, có thói quen xấu theo.
Tui đọc mấy cái code mà thiếu option explicit và thiếu khởi tạo biến thì rất khó chịu, xóa liền.
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,007
Được thích
15,548
Điểm
1,860
Tuổi
60
Nơi ở
An Giang
Xin các bác viết code giúp em ạ,
"Quăng" file lên cũng phải giải thích làm cái gì, trên cột nào... chứ thế này thì chắc phải hỏi anh Google xem code bạn viết là muốn làm cái gì.
Nếu anh Google trả lời được chắc sẽ có người giúp bạn.
 

duonghychi

Thành viên mới
Tham gia ngày
17 Tháng tư 2017
Bài viết
28
Được thích
1
Điểm
165
"Quăng" file lên cũng phải giải thích làm cái gì, trên cột nào... chứ thế này thì chắc phải hỏi anh Google xem code bạn viết là muốn làm cái gì.
Nếu anh Google trả lời được chắc sẽ có người giúp bạn.
Dạ, em muốn tính tổng cho các dòng từ vùng "f7:bz604" kết quả, hiện thị tại "e7:e604, mong bác giúp em các viết code cho mảng ạ. Em cảm ơn!
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,007
Được thích
15,548
Điểm
1,860
Tuổi
60
Nơi ở
An Giang
Dạ, em muốn tính tổng cho các dòng từ vùng "f7:bz604" kết quả, hiện thị tại "e7:e604, mong bác giúp em các viết code cho mảng ạ. Em cảm ơn!
Dùng tạm cái này xem.
PHP:
Option Explicit

Public Sub sGpe()
Dim sArr(), dArr(), I As Long, J As Long, R As Long, Col As Long
With Sheets("TINH NVL")
    Col = .Range("XFD5").End(xlToLeft).Column - 5
    R = .Range("C100000").End(xlUp).Row - 6
    sArr = .Range("F7").Resize(R, Col).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        For J = 1 To Col
            dArr(I, 1) = dArr(I, 1) + sArr(I, J)
        Next J
    Next I
    .Range("E7").Resize(R) = dArr
End With
End Sub
 

thanhphuongvip

Thành viên hoạt động
Tham gia ngày
16 Tháng một 2010
Bài viết
115
Được thích
16
Điểm
370
Tuổi
30
Dùng tạm cái này xem.
PHP:
Option Explicit

Public Sub sGpe()
Dim sArr(), dArr(), I As Long, J As Long, R As Long, Col As Long
With Sheets("TINH NVL")
    Col = .Range("XFD5").End(xlToLeft).Column - 5
    R = .Range("C100000").End(xlUp).Row - 6
    sArr = .Range("F7").Resize(R, Col).Value
   [B] R = UBound(sArr)[/B]
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        For J = 1 To Col
            dArr(I, 1) = dArr(I, 1) + sArr(I, J)
        Next J
    Next I
    .Range("E7").Resize(R) = dArr
End With
End Sub
Cho mình hỏi dòng in đậm có cần thiết ko, và thêm nó có tác dụng gì, và nếu ko có thì sao ạ? Tại mình bỏ cái dòng đó code vẫn chạy bình thường ạ!
Xin cảm ơn
 

snow25

Thành viên gắn bó
Tham gia ngày
24 Tháng bảy 2018
Bài viết
1,922
Được thích
1,665
Điểm
210
Cho mình hỏi dòng in đậm có cần thiết ko, và thêm nó có tác dụng gì, và nếu ko có thì sao ạ? Tại mình bỏ cái dòng đó code vẫn chạy bình thường ạ!
Xin cảm ơn
Chạy bình thường mà có đúng không vậy bạn ?
Bỏ đi thì R = 0, chạy ra sao thì bạn tìm hiểu tiếp :D
Câu này hả bạn hay câu nào.
Option Explicit
 

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
Sorry, em lại nhanh nhẩu đoảng, nhầm. Do không đọc kỹ đoạn code phía trên.
Mã:
.....
R = .Range("C100000").End(xlUp).Row - 6
....
R = UBound(sArr)
 
Lần chỉnh sửa cuối:

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,818
Được thích
2,818
Điểm
360
Vậy cuối cùng là chỗ đó sao vậy Snow nhỉ?
R = .Range("C100000").End(xlUp).Row - 6 ' (A)
sArr = .Range("F7").Resize(R, Col).Value ' (B)
R = UBound(sArr) ' (C)
(A) R là số dòng có dữ liệu trên sheet tính từ dòng 7. Vd. dữ liệu tới dòng 11 thì
.Range("C100000").End(xlUp).Row trả về 11, vậy R = 11 - 6 = 5 (5 dòng dữ liệu: 7, 8, 9, 10, 11)

(B) các dòng dữ liệu trên sheet tính từ dòng 7 được nhập vào mảng sArr. Tức trên sheet có R dòng dữ liệu, và trong sArr cũng có R dòng.

(C) R bằng chỉ số trên của dòng trong mảng sArr. Do chỉ số được tính từ 1 nên R cũng chính là số dòng trong mảng sArr, mà số dòng trong sArr bằng số dòng có dữ liệu trên sheet tính từ dòng 7. Vậy R ở (C) bằng R ở (A). Chính vì thế bạn bỏ R ở (C) thì code vẫn chạy vì R đã được xác định tại (A).

R ở điểm (C) thừa nhưng nếu có thì bạn nhìn ra ngay, khỏi suy nghĩ kỹ, là mảng dArr có cùng kích thước với mảng sArr. Thế thôi.

Ở đây code ngắn nên bạn nhìn thấy ngay là R ở (C) không cần nhưng nếu code dài mà (C) nằm ở cuối thì bạn không nhìn thấy ngay được. Có R ở (C) thì dứt khoát dArr có cùng kích thước với mảng sArr.
 

A Đặng

Thành viên mới
Tham gia ngày
18 Tháng mười hai 2018
Bài viết
31
Được thích
1
Điểm
15
Nơi ở
Thủ Dầu Một, Bình Dương
Dear All.
Mọi người cho e hỏi có cách nào khi sử dụng FileSystemScriptingObject để GetFolder lấy NameFile trong thư mục thì nó bỏ qua các file ẩn và các file tạm đang mở không ạ.
Cám ơn rất nhiều .
 

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
Không bạn, Files trả về hết tất cả các File object với mọi thuộc tính. Bạn muốn lọc thì dùng GetAttr hay File.Attributes để loại ra với vbHidden = Hidden = 2
Còn nếu file đang mở thì có nhiều loại đang mở: mở share read, mở share write, mở exclusive (độc quyền). Bạn có thể dùng Open statement: Open xxx As Read Write Lock Read Write để thử mở độc quyền file đó. Nhớ bẫy lỗi On Error. Nếu mở được thì file đó chưa mở, không được thì có thằng process khác đang mở rồi.
Còn muốn biết file đó đang được process nào mở, mở như thế nào, quyền ra sao, security attribues ra sao thì phải dùng NT API. Cách này hơi lòng vòng, phức tạp. Các tool phổ biến xem được vấn đề này là Process Explorer, Process Hacker...
 
Top