Giải thích và sửa lại giúp em code này với ạ (1 người xem)

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

FPT_online

Thành viên hoạt động
Tham gia
27/10/13
Bài viết
133
Được thích
16
PHP:
Public Sub loc()Dim Rng(), Arr(1 To 100, 1 To 10), Arr2(1 To 100, 1 To 9), I As Long, J As Long, k As LongDim ws As Worksheet, N As Long, DH As String, Ngay As Long, DK As Long, KX As Long  For Each ws In Worksheets    If IsNumeric(Left(ws.Name, 1)) Then        Rng = ws.Range(ws.[B2], ws.[b65000].End(xlUp)).Offset(, -1).Resize(, 17).Value                    Ngay = ws.[Q1].Value                    For I = 1 To UBound(Rng, 1)                        If Rng(I, 1) <> "" Then DH = Rng(I, 1)                    If Rng(I, 17) > 0 Then                            k = k + 1                        If k <= 100 Then                                Arr(k, 1) = k                            For N = 2 To 8                                Arr(k, N) = Rng(I, N)                            Next N                                Arr(k, 8) = Rng(I, 17)                                Arr(k, 7) = DH                        Else                                KX = KX + 1                                Arr2(KX, 1) = k                            For N = 2 To 8                                Arr2(KX, N) = Rng(I, N)                            Next N                                Arr2(KX, 8) = Rng(I, 18)                                Arr2(KX, 7) = DH                        End If                    End If            Next I    End IfNext wsWith Sheet1            .[A1].Resize(100, 10).Value = Arr             If [C1] <> "" Then            .[K1].Value = Ngay            .[K1].ClearContents        End If    End WithEnd Sub

Em rất thích tìm hiểu về code VBA em có một số thắc mắc nhờ các thầy chỉ giúp
- Tại sao có một số biến cần khai báo là "Dim N as long, hoặc dim DH as string, nhưng một số cái lại chỉ cần khai báo là Dim Rng(), hoặc khai báo như Arr(1 to 100, 1 to 10) em chưa hiểu từng kiểu khai báo này các thầy giúp em trong phần này với
-"If IsNumeric(Left(ws.Name, 1)) Then" Em thấy hình như có cả hàm left trong này nhưng khi nào thì có thể chèn vào được ạ
Code này em chắp vá từ các bài của các thầy viết nên có thể nhìn lủng củng vậy các thầy sửa lại giúp em cho ngắn gọn và chuẩn luôn với. Em cám ơn nhiều
 
PHP:
Public Sub loc()Dim Rng(), Arr(1 To 100, 1 To 10), Arr2(1 To 100, 1 To 9), I As Long, J As Long, k As LongDim ws As Worksheet, N As Long, DH As String, Ngay As Long, DK As Long, KX As Long  For Each ws In Worksheets    If IsNumeric(Left(ws.Name, 1)) Then        Rng = ws.Range(ws.[B2], ws.[b65000].End(xlUp)).Offset(, -1).Resize(, 17).Value                    Ngay = ws.[Q1].Value                    For I = 1 To UBound(Rng, 1)                        If Rng(I, 1) <> "" Then DH = Rng(I, 1)                    If Rng(I, 17) > 0 Then                            k = k + 1                        If k <= 100 Then                                Arr(k, 1) = k                            For N = 2 To 8                                Arr(k, N) = Rng(I, N)                            Next N                                Arr(k, 8) = Rng(I, 17)                                Arr(k, 7) = DH                        Else                                KX = KX + 1                                Arr2(KX, 1) = k                            For N = 2 To 8                                Arr2(KX, N) = Rng(I, N)                            Next N                                Arr2(KX, 8) = Rng(I, 18)                                Arr2(KX, 7) = DH                        End If                    End If            Next I    End IfNext wsWith Sheet1            .[A1].Resize(100, 10).Value = Arr             If [C1] <> "" Then            .[K1].Value = Ngay            .[K1].ClearContents        End If    End WithEnd Sub

Em rất thích tìm hiểu về code VBA em có một số thắc mắc nhờ các thầy chỉ giúp
- Tại sao có một số biến cần khai báo là "Dim N as long, hoặc dim DH as string, nhưng một số cái lại chỉ cần khai báo là Dim Rng(), hoặc khai báo như Arr(1 to 100, 1 to 10) em chưa hiểu từng kiểu khai báo này các thầy giúp em trong phần này với
-"If IsNumeric(Left(ws.Name, 1)) Then" Em thấy hình như có cả hàm left trong này nhưng khi nào thì có thể chèn vào được ạ
Code này em chắp vá từ các bài của các thầy viết nên có thể nhìn lủng củng vậy các thầy sửa lại giúp em cho ngắn gọn và chuẩn luôn với. Em cám ơn nhiều

Chào bạn,
Nội dung 1: Bản thân mình cũng đang thắc mắc, đang hóng có cao thủ nào trả lời
Nội dung 2: Chắc bạn cũng mới nghiên cứu về cái này, bạn search danh sách các hàm dùng trong VBA thì sẽ hiểu được với hàm nào bạn có thể chèn trực tiếp, hàm nào phải đi kèm Application.fuction nhé.
 
Upvote 0
PHP:
em chưa hiểu từng kiểu khai báo này các thầy giúp em trong phần này với
-"If IsNumeric(Left(ws.Name, 1)) Then" Em thấy hình như có cả hàm left trong này nhưng khi nào thì có thể chèn vào được ạ
[/QUOTE]
[COLOR=#000000][B]Dim N as long[/B], N là biến lưu giá trị thuộc số nguyên còn vùng giá trị mà nó có thể lưu thì bạn nên xem độ lớn của kiểu long trong VBA là bao nhiêu.
tương tự [B]Dim DH as string[/B], Dh là biến lưu giá trị là chuỗi
trong VBA cho phép khai báo tường minh hay không tường minh
trong 2 ví dụ trên là khai báo kiểu tường minh cho biết kiểu giá trị nhận của 1 biến là kiểu gì
còn ví dụ bên dưới là không tường minh
[/COLOR][B][COLOR=#000000]Dim Rng() là khai báo 1 cái mảng, [/COLOR][/B][COLOR=#000000]mà cái mảng này không biết nhận giá trị kiểu gì ,có thể các phần từ của nó nhận giá trị kiếu số, kiểu chuỗi, kiểu tiền tệ,.. hay tất cả những kiểu đó luôn
(Chú ý [/COLOR][B][COLOR=#000000]Dim Rng() nó chỉ thông báo là cái mảng thôi, chứ chưa biết mảng mấy chiều và số phần tử trong mảng là bao nhiêu)
[/COLOR][/B][COLOR=#000000]
[/COLOR][B]Dim Arr(1 To 100, 1 To 10) [/B]cũng là khai báo kiểu mảng không tường minh, nhưng nó cho biết số chiều là 2 và số phần tử từng chiều là bao nhiêu
[COLOR=#000000][B]If IsNumeric(Left(ws.Name, 1)) Then[/B] cái này người ta viết tắt đấy nó tương đương
[/COLOR][B]If IsNumeric(Left(ws.Name, 1))= true Then [/B]lấy 1 ký tự bên trái của tên kiểm tra nó có phải là số không
[COLOR=#000000]vì kết quả [/COLOR][B]IsNumeric(Left(ws.Name, 1)) ra true false [/B][B]luôn [/B]nên người ta không cần so sánh thêm nữa[COLOR=#000000]
[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0
Dim Rng() tương đương với Dim Rng As Variant (kiểu mặc định)
Dim Arr(1 to 100, 1 to 10): mảng 2 chiều, chỉ số thứ nhất từ 1 đến 100, chỉ số thứ 2 từ 1 đến 10
Dim Arr(100,10): chỉ số thứ nhất từ 0 đến 100, chỉ số thứ 2 từ 0 đến 10
Array có thể khai báo động Arr(), sau này có thể Redim, hoặc Redim Preserve
IsNumerric(Left(ws.Name, 1)) : ký tự thứ nhất trong tên của sheet là số. Hàm Left dùng với String
 
Upvote 0
Để nắm bắt được các macro của người khác viết, bạn cũng cần có 1 số kiến thức tối thiểu (KTTT) về VBA để đối ứng;
Những KTTT đó, theo mình là

Các câu lệnh bố trí theo cụm, như sau:

PHP:
Sub HocVBA
 Dim Ngu As String, An As String
 Dim Arr(), Sh As WorkSheet, Rng As Range
 Dim J As Long
 
 For J = 1 To 9
    If J = 2 Or J = 4 Then
          An = An & Ngu
    ElSe
          An = Ngu & An
    End if
 Next J
 MsgBox An
End Sub

Thứ nữa, Bạn nên đưa file lên, chỉ mỗi 1 macro thì chưa thể nói lên điều gì chính xác được.
 
Upvote 0
Dim Rng() tương đương với Dim Rng As Variant (kiểu mặc định)
...
Dim Arr(100,10): chỉ số thứ nhất từ 0 đến 100, chỉ số thứ 2 từ 0 đến 10
...
IsNumerric(Left(ws.Name, 1)) : ký tự thứ nhất trong tên của sheet là số. Hàm Left dùng với String

1. Dim Rng() tương đương với Dim Rng() as variant.
Dim Rng as variant có điểm khác.
Trường hợp thứ nhất, Rng đã được khai báo là mảng. Trường hợp thứ hai, nó là gì cũng được, mảng cũng được mà không mảng cũng được.

2. Chỉ mặc định thế thôi chứ không nhất thiết luôn luôn là vậy. Chỉ số bắt đầu còn tuỳ theo câu định Option Base ... (Nếu option base 1 thì chỉ số bắt đầu từ 1)

3. Isnumeric là hàm dùng để xét xem một trị gì đó có phải dạng số hay không. Hàm này nhận tham là variant. Left là hàm chuyên việc cắt lấy 1 phần chuỗi (phần đầu, bên trái chuỗi), vì vậy trị trả về của nó là chuỗi. Đem biểu thức hàm left làm tham cho isnumeric có nghĩa là xét xem một đoạn đầu của chuỗi có phải là dạng số hay không. @chủ thớt: chú ý là tôi dùng từ "tham", chứ chẳng phải chèn chiếc gì cả.

[...
-"If IsNumeric(Left(ws.Name, 1)) Then" Em thấy hình như có cả hàm left trong này nhưng khi nào thì có thể chèn vào được ạ
Code này em chắp vá từ các bài của các thầy viết nên có thể nhìn lủng củng vậy các thầy sửa lại giúp em cho ngắn gọn và chuẩn luôn với. Em cám ơn nhiều

a) xem câu 3 ở trên, đây là cách dùng một biểu thức làm tham cho một hàm, trong trường hợp này, biểu thức là một hàm khác.

b) bạn hoàn toàn không có một căn bản về cấu trúc một sub hay function để chạy code vba. Nên chịu khó học từ đầu. Đem cái code này ra giải thích sẽ rối như tơ vò.
 
Upvote 0
Tại sao em vào cửa sổ gõ VBA bấm F2 bấm một hàm nào vào cũng thấy hiển thị lên, cái này có tác dụng gì không ạ?
 
Upvote 0

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

Back
Top Bottom