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

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Trước tiên ta 'mần' cái Sub trước đi nha:
PHP:
Sub Main()
 Dim Tmp, sArr():                       Dim txt As String
 Dim I As Long, J As Long

1 sArr = Sheet1.Range("A2:A699").Value: maxA = UBound(sArr, 1)
 ReDim darr(1 To maxA, 1 To 4)
3 For I = 1 To maxA
    txt = sArr(I, 1)
5    If txt <> "" Then
        Tmp = TachText(txt)
7        If TypeName(Tmp) = "Variant()" Then
            For J = 1 To 4
9                darr(I, J) = Tmp(J)
            Next J
11        End If
    End If
13 Next I
 Sheet1.Range("F2").Resize(maxA, 4).NumberFormat = "@"
15 Sheet1.Range("F2").Resize(maxA, 4) = darr
End Sub

Hai dòng lệnh trước D1: Khai báo các biến cần xài trong chương trình; (Cái loại biến đã được gôm vô cùng loại)
D1: Mệnh đề đầu: Lấy vùng dữ liệu có địa chỉ cho vô biến mảng (đã khai báo)
Mệnh đề sau: Lấy kết quả của hàm (VBA) lấy ôố dòng của mảng ấn vô biến MaxA đã khai báo;
D2: Khai báo thêm 1 biến mảng gồm có số dòng bằng với số dòng mảng của mảng (chứa dữ liệu) & số ôột là 4
D3: Tạo vòng lặp duyệt theo biến I từ dòng đầu cho đến dòng cuối của mảng (chứa dữ liệu)
Vòng lặp này kết thúc tại D13;
D4: Lấy ôố liệu chứa trong dòng tương ứng đang duyệt ấn vô biến (chứa chuỗi)
D5: Điều kiện: Nếu biến chuỗi vừa nhận trị không là chuỗi rỗng thì thực thi các dòng lệnh cho đến trước D12
D6: Cung cấp cho hàm TachText tham biến chứa trong Txt & ấn kết quả hàm này trả về vô biến 'Tmp';
D7: Điều kiện: Nếu kiểu/loại của biến 'Tmp' này là mảng (Array) thì thực hiện các lệnh cho đến trước D11
D8: Tạo dựng vòng lặp biến thiên từ 1 đến 4; Vòng lặp này kết thúc tại D10;
D9: Lấy số liệu tương ứng trong mảng 'Tmp' nạp vô mảng ('đích') (khai báo sau cùng) theo cột tương ứng;
D10..D13: (Đã nêu bên trên)
D14: Định dạng 1 vùng làm bãi đáp của mảng ('đích')
D15: Lấy số liệu trong mãng ('đích') ấn xuống vùng đã định dạng

Rất vui đã giúp bạn phần nào đó nhỏ nhoi!
 
Upvote 0
Trước tiên ta 'mần' cái Sub trước đi nha:
PHP:
Sub Main()
 Dim Tmp, sArr():                       Dim txt As String
 Dim I As Long, J As Long

1 sArr = Sheet1.Range("A2:A699").Value: maxA = UBound(sArr, 1)
 ReDim darr(1 To maxA, 1 To 4)
3 For I = 1 To maxA
    txt = sArr(I, 1)
5    If txt <> "" Then
        Tmp = TachText(txt)
7        If TypeName(Tmp) = "Variant()" Then
            For J = 1 To 4
9                darr(I, J) = Tmp(J)
            Next J
11        End If
    End If
13 Next I
 Sheet1.Range("F2").Resize(maxA, 4).NumberFormat = "@"
15 Sheet1.Range("F2").Resize(maxA, 4) = darr
End Sub

Hai dòng lệnh trước D1: Khai báo các biến cần xài trong chương trình; (Cái loại biến đã được gôm vô cùng loại)
D1: Mệnh đề đầu: Lấy vùng dữ liệu có địa chỉ cho vô biến mảng (đã khai báo)
Mệnh đề sau: Lấy kết quả của hàm (VBA) lấy ôố dòng của mảng ấn vô biến MaxA đã khai báo;
D2: Khai báo thêm 1 biến mảng gồm có số dòng bằng với số dòng mảng của mảng (chứa dữ liệu) & số ôột là 4
D3: Tạo vòng lặp duyệt theo biến I từ dòng đầu cho đến dòng cuối của mảng (chứa dữ liệu)
Vòng lặp này kết thúc tại D13;
D4: Lấy ôố liệu chứa trong dòng tương ứng đang duyệt ấn vô biến (chứa chuỗi)
D5: Điều kiện: Nếu biến chuỗi vừa nhận trị không là chuỗi rỗng thì thực thi các dòng lệnh cho đến trước D12
D6: Cung cấp cho hàm TachText tham biến chứa trong Txt & ấn kết quả hàm này trả về vô biến 'Tmp';
D7: Điều kiện: Nếu kiểu/loại của biến 'Tmp' này là mảng (Array) thì thực hiện các lệnh cho đến trước D11
D8: Tạo dựng vòng lặp biến thiên từ 1 đến 4; Vòng lặp này kết thúc tại D10;
D9: Lấy số liệu tương ứng trong mảng 'Tmp' nạp vô mảng ('đích') (khai báo sau cùng) theo cột tương ứng;
D10..D13: (Đã nêu bên trên)
D14: Định dạng 1 vùng làm bãi đáp của mảng ('đích')
D15: Lấy số liệu trong mãng ('đích') ấn xuống vùng đã định dạng

Rất vui đã giúp bạn phần nào đó nhỏ nhoi!

Cảm ơn Anh Hoàng nhiều nhưng vấn đề em nêu trên Anh hỗ trợ em với!
 
Upvote 0
Các cao thủ VBA thân mến!

Em có 1 file excel muốn điền từng số trong ô AC11 vào từng ô từ R9:D9 ( số chạy từ phải qua trái) sau đó tự động đổi số thành chữ dạng như trong file excel. Ai biết cho em xin code với nhé. Em xin chân thành cảm ơn các bác!
 

File đính kèm

  • Giay De Nghi Chuyen Tien.xlsm
    28.4 KB · Đọc: 7
Upvote 0
Chào mọi người. Cho mình hỏi về chức năng set for cus trong file sau, vì sao khi click chuột cột K, hiện Form, nó lại không hiện cái nhấp nháy trong ô Theo hàng lên vậy ? Mình cảm ơn .

Untitled.png
 

File đính kèm

  • GPE.xlsm
    595.6 KB · Đọc: 9
Upvote 0

File đính kèm

  • Copy of GPE.xlsm
    695.1 KB · Đọc: 14
Upvote 0
Cám ơn bạn. Mình ngồi mò mẫm ra được là ở phần ShowModal của Form đag để là FALSE, chuyển về True là Ok. Cũng ko biết vì sao luôn !
 
Upvote 0
Chính xác là thế. Ta làm trên Excel thì có thể tận dụng những thứ có sẵn của Excel
Trừ trường hợp ta viết code nhưng dự tính sẽ dùng cho các ứng dụng bên ngoài (VB chẳng hạn) và ta buộc phải viết hàm phục vụ cho riêng ta.
Đương nhiên ta cũng không thể cố viết làm sao để bì được với MAX của anh Bill (đó là công sức của 1 siêu tập thể mà) ---> Yêu cầu nó phục vụ đúng ý đồ của ta là đủ
chào thầy, e có 1 file muốn hoàn thiện nhưng không biết tìm sự giúp đỡ ở đâu, thầy giúp e được không ạ,xin chân thành cảm ơn!
 

File đính kèm

  • Xin giup Do.xlsm
    14 KB · Đọc: 8
Upvote 0
ấn enter or tab data sẽ tự động chuyển đến ô A5, B5, C5 khi thỏa mãn điều kiện đặt ra ở mỗi ô đó, nếu không thỏa mãn sẽ bị bỏ qua,
Theo mình nghĩ, thì bạn phải nêu 3 điều kiện này lên mới thực hiện được;
Như độ dài, Từ đầu tiên gồm 2 hay 3 chữ cái hay chữ cái thứ 3 là gì đó,. . .
 
Upvote 0
Theo mình nghĩ, thì bạn phải nêu 3 điều kiện này lên mới thực hiện được;
Như độ dài, Từ đầu tiên gồm 2 hay 3 chữ cái hay chữ cái thứ 3 là gì đó,. . .
vâng, mình có add comment trong file ạ, cụ thể ô A5: Là ký tự dạng text, luôn là 7 ký tự và có ký tự P ở đầu. (vd P985700)
ô B5: luôn là dãy ký tự có Q ở đầu, và tiếp sau dó là kí tự số (vd Q123456)
ô C5: luôn là dãy ký tự có Z ở đầu, (vd Z123b45)
 
Upvote 0
Mã:
Sub DeleteBlankRows()
    Dim I As Long
    If WorksheetFunction.CountA(Selection) = 0 Then
        MsgBox “Hien tai chua co vung du lieu nao duoc chon”, vbInformation, “Cuuhotinhoc.com”
        Exit Sub
    End If
    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        For I = Selection.Rows.Count To 1 Step -1
            If WorksheetFunction.CountA(Selection.Rows(I)) = 0 Then
                Selection.Rows(I).EntireRow.Delete
            End If
        Next I
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
End Sub
Public Sub GPE_KINH()
Dim sArr(), dArr(), I As Long, K As Long, R As Long, Tem As String, DK As String
DK = "Kính"
With Sheets("PTVT")
    sArr = .Range("A3", .Range("B60000").End(xlUp)).Resize(, 8).Value
    R = UBound(sArr)
End With
ReDim dArr(1 To R, 1 To 7)
For I = 1 To R
    If sArr(I, 1) <> Empty Then Tem = sArr(I, 1)
    If Tem = DK Then
        If sArr(I, 2) <> Empty Then
            K = K + 1
            dArr(K, 1) = K
            dArr(K, 2) = sArr(I, 2):    dArr(K, 3) = Tem
            dArr(K, 4) = sArr(I, 8):    dArr(K, 5) = sArr(I, 5)
            dArr(K, 6) = sArr(I, 4):    dArr(K, 7) = sArr(I, 6)
        End If
    End If
Next I
With Sheets("THVT")
    .Range("A9:G1000").ClearContents
    .Range("A9:G9").Resize(K) = dArr
End With
End Sub
em có đoạn code trên muốn biến thể để tổng hợp các loại vật tư khác thì phải sữa thế nào mấy anh chỉ em với cả 2 file bên dưới ah
cám ơn tất cả ace
https://drive.google.com/open?id=0B075UkAw9fa3aUNmbXRXTmNadUE
 

File đính kèm

  • BOM TINH GIA NHOM XINGFA - c3323 - c3033 CHUAN lam lai+THVT.xls
    3.9 MB · Đọc: 15
Upvote 0
Thứ nhất: Hình như 2 macro này ai đó đã viết cho bạn & bạn đưa hết lên đây là không nên;
Lẽ ra bạn chỉ nên đưa macro thứ hai mà thôi; Để mọi người đỡ mất thời gian do đọc thêm 1 cái không/chưa cần thiết

Thứ hai: Macro chỉ hoạt động trên 2 trang tính; Vậy mà bạn đưa lên đến 75 trang tính làm chi vậy?
Đó là bạn có í làm tốn thời gian của người có nhã í giúp bạn rồi còn gì!

Thứ ba: Bạn muốn tổng hợp thêm các loại vật tư khác, thì bạn cần lập danh mục các loại vật tư đó;
Danh mục đó cần có ở 1 trang tính nào đó!. . . . (Ví dụ ta có thể bỏ vô trang 'MucLuc')
(Có nghĩa là thừa rất nhiều trang tính không cần thiết mà bạn đã đưa lên, nhưng vẫn thiếu trang tính cần thiết (phụ trợ) giúp cho CSDL hoạt động trơn tru lại thiếu.)

Các vấn đề khác:
(*) Tên trang tính quá dài; Cần tìm cách rút gọn lại (ví dụ nghiên cứu lại cách tạo mã nguyên vật liệu của bạn)
(*) Đã xài VBA thì tên trang tính hoàn toàn không nên là tiếng Việt có dấu
(*) Nếu macro không do bạn tạo ra, thì bạn nên nhờ ai đó dịch sang tiếng Việt; bản dịch này sẽ làm cho bạn có khái niệm đường đi nước bước của các lệnh trong macro & có hướng để cải tiến hay tự/nhờ ai đó sửa đổi trong quá trình vận hành.
Lí do phải dịch sang tiếng Ta để hiểu vì CSDL không tỉnh tại; nó sẽ thay đổi mục này, điểm kia theo thời gian;
1 khi bạn có khái niệm bạn sẽ nhờ vã theo hướng nhanh nhất cho bạn!
(Ví dụ: Nếu bạn biết nội dung macro sau trong 2 macro, bạn sẽ không đưa lên 1 đống trang tính như vậy, để làm phiền người có nhã í giúp mình!)

-0-0-0- ><<..., -0-0-0-
 
Upvote 0
dạ em hiểu ý anh rồi để em táy ra rồi gủi up file sau, 2 đoạn code trên đoạn đầu e search con đoạn thứ hai của bác bate bên diễn đàn mình
Em xin lỗi ak
 

File đính kèm

  • THVT.xls
    1.3 MB · Đọc: 7
  • THVT NHUA.xls
    989 KB · Đọc: 10
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Public Sub GPE_KINH()
Dim sArr(), dArr(), I As Long, K As Long, R As Long, Tem As String, DK As String
DK = "Kính"
With Sheets("PTVT")
    sArr = .Range("A3", .Range("B60000").End(xlUp)).Resize(, 8).Value
    R = UBound(sArr)
End With
ReDim dArr(1 To R, 1 To 7)
For I = 1 To R
    If sArr(I, 1) <> Empty Then Tem = sArr(I, 1)
    If Tem = DK Then
        If sArr(I, 2) <> Empty Then
            K = K + 1
            dArr(K, 1) = K
            dArr(K, 2) = sArr(I, 2):    dArr(K, 3) = Tem
            dArr(K, 4) = sArr(I, 8):    dArr(K, 5) = sArr(I, 5)
            dArr(K, 6) = sArr(I, 4):    dArr(K, 7) = sArr(I, 6)
        End If
    End If
Next I
With Sheets("THVT")
    .Range("A9:G1000").ClearContents
    .Range("A9:G9").Resize(K) = dArr
End With
End Sub
em có đoạn code trên muốn biến thể để tổng hợp các loại vật tư khác thì phải sữa thế nào mấy anh chỉ em với cả 2 file bên dưới ah
cám ơn tất cả ace
- Chỉ làm 1 file "CUA NHUA", bài #944 bên trên, file khác bạn tự chỉnh.
- Tạo 1 ô làm điều kiện lọc tại J1 sheet THVT (dùng validation, lấy dữ liệu duy nhất trong cột A sheet PTVT)
- Chép Sub này vào Module.
PHP:
Public Sub GPE_LOC()
Dim sArr(), dArr(), I As Long, K As Long, R As Long, Tem As String, DK As String
DK = Range("J1").Value
With Sheets("PTVT")
    sArr = .Range("A3", .Range("B60000").End(xlUp)).Resize(, 8).Value
    R = UBound(sArr)
End With
ReDim dArr(1 To R, 1 To 7)
For I = 1 To R
    If sArr(I, 1) <> Empty Then Tem = sArr(I, 1)
    If Tem = DK Then
        If sArr(I, 2) <> Empty Then
            K = K + 1
            dArr(K, 1) = K
            dArr(K, 2) = sArr(I, 2):    dArr(K, 3) = Tem
            dArr(K, 4) = sArr(I, 8):    dArr(K, 5) = sArr(I, 5)
            dArr(K, 6) = sArr(I, 4):    dArr(K, 7) = sArr(I, 6)
        End If
    End If
Next I
With Sheets("THVT")
    .Range("A9:G1000").ClearContents
    If K Then .Range("A9:G9").Resize(K) = dArr
End With
End Sub
- Chép cái này vào vùng VBA sheet THVT
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$1" Then GPE_LOC
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi có hàm nào trong VBA để kiểm tra 3 ô liền nhau xem có giá trị hay không ạ? Nếu như cả 3 đều có giá trị thì trả về kết quả là True còn lại là False. Có giá trị ở đây được hiểu là tất cả các giá trị khác ô trống. (Không tính cách so sánh với "" vì em thấy đôi lúc không hiểu sao có vấn đề nó không đúng)
 
Lần chỉnh sửa cuối:
Upvote 0
Thì viết 1 hàm tự tạo mà khảo sát thôi.

Ví du như:
PHP:
Function KiemTra(Rng As Range) As Boolean
 Dim Cls As Range:              Dim Dem As Byte

 For Each Cls In Rng
    Dem = Dem + 1
    If Cls.Value = "" Then
        Exit Function
    End If
 Next Cls
 If Rng.Cells.Count = Dem Then KiemTra = Not KiemTra
End Function
 
Upvote 0
Cho em hỏi có hàm nào trong VBA để kiểm tra 3 ô liền nhau xem có giá trị hay không ạ? Nếu như cả 3 đều có giá trị thì trả về kết quả là True còn lại là False. Có giá trị ở đây được hiểu là tất cả các giá trị khác ô trống. (Không tính cách so sánh với "" vì em thấy đôi lúc không hiểu sao có vấn đề nó không đúng)
PHP:
Sub vidu1()
Dim rng As Range, cll As Range, chk As Boolean
'Set rng = Sheet1.Range("A1:A3")
For Each cll In rng
    If cll = Empty Then
        MsgBox False
        chk = True
        Exit For
    End If
Next cll
If chk = False Then MsgBox True
End Sub
'--------
Sub vidu2()
Dim Txt As String
Txt = Left(cell(i), 1) & Left(cell(i + 1), 1) & Left(cell(i + 2), 1)
If Len(Txt) = 3 Then MsgBox True Else MsgBox False
End Sub
 
Upvote 0
Cảm ơn mọi người. Mình làm file chấm công đã cho vào sử dụng một thời gian rồi nhưng mình cảm thấy vẫn có cái gì đó chưa ưng ý. Code khá dài. Mình có thể viết các đoạn ghi chú vào từng code và mọi người đưa ra lời khuyên hoặc giải pháp tốt hơn giúp mình được không? Code mình hỏi nằm trong module Tran Minh Anh. File này xây dựng dựa trên khá nhiều sự giúp đỡ cộng với mình tham khảo thêm trên diễn đàn mình cho nên mình chắp ghép từng chút một chứ mình không nắm cơ bản về VBA. Mong mọi người chỉ dạy!
 

File đính kèm

  • Cham cong.xlsb
    707.6 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Xin chào cả nhà hiện e đăng gặp 1 vấn đề rất lớn trong việc soạn thảo của ecxel, là khi có thông báo thì luôn kèm theo tiếng động tin tin rất khó chịu, nhiều lúc làm việc cả ngày đêm mà nó cứ báo suốt, rất khó chịu. Cả nhà giúp e với nhé, vẩn hiện thông báo lỗi hay thông báo gì đó cũng được, nhưng đừng có kèm theo tiếng kêu tin tin. Em cảm ơn cả nhà
 
Upvote 0
Em xem đã có 6 lượt tải vậy có anh chị em nào có ý kiến gì cho em không/?
 
Upvote 0
Web KT

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

Back
Top Bottom