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:
Mã:
Sub Test()
With Sheets("KH")
If .Range("D48") <> Empty Then
     .Range("AQ47") = "."
If .Range("D54") <> Empty Then
     .Range("AQ53") = "."
If .Range("D60") <> Empty Then
     .Range("AQ59") = "."
If .Range("D66") <> Empty Then
     .Range("AQ65") = "."
End If
End If
End If
End If
End With
End Sub
Đoạn code trên có thể viết gọn lại nữa không ạ. Nếu được, nhờ các anh chị chỉ giúp.
Xin cảm ơn
 
Upvote 0
Mã:
Sub Test()
With Sheets("KH")
If .Range("D48") <> Empty Then
     .Range("AQ47") = "."
If .Range("D54") <> Empty Then
     .Range("AQ53") = "."
If .Range("D60") <> Empty Then
     .Range("AQ59") = "."
If .Range("D66") <> Empty Then
     .Range("AQ65") = "."
End If
End If
End If
End If
End With
End Sub
Đoạn code trên có thể viết gọn lại nữa không ạ. Nếu được, nhờ các anh chị chỉ giúp.
Xin cảm ơn
Bạn hiểu đoạn code trên không.Đó là 4 hàm if lồng nhau.Cái điều kiện cuối cùng thì cần phải đúng 4 cái thì mới được thực hiện.Nên không thể rút gọn được.
 
Upvote 0
Mã:
Sub Test()
With Sheets("KH")
If .Range("D48") <> Empty Then
     .Range("AQ47") = "."
If .Range("D54") <> Empty Then
     .Range("AQ53") = "."
If .Range("D60") <> Empty Then
     .Range("AQ59") = "."
If .Range("D66") <> Empty Then
     .Range("AQ65") = "."
End If
End If
End If
End If
End With
End Sub
Đoạn code trên có thể viết gọn lại nữa không ạ. Nếu được, nhờ các anh chị chỉ giúp.
Xin cảm ơn
Nếu D48 = Empty và D54 <> Empty thì AQ53 có bằng "." không? Nếu AQ53 = "." thì tôi nghĩ code trên còn thiếu.
 
Upvote 0
hi cả nhả e đang làm thông báo điểm với bảng điểm từ file excel sang file thông báo là file word nhưng vị trí bảng điểm hiện thị trong file word không đúng vị trí mà luôn hiện ở cuối trang word mong các bác giúp em.Em cảm ơn
 

File đính kèm

  • danhsach.xlsm
    20.5 KB · Đọc: 6
  • bangdiem.doc
    26.5 KB · Đọc: 4
Upvote 0
Em nhờ các bác giúp 4 trường hợp sau giúp:


1/ Code VBA để coppy sau VD: Sheet 1
Khi ta dang Mở File A ở Sheet 1 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet1 File C những cột A,B,C,D Nếu thỏa cột B có chữ "nhà xe" vào Sheet1 File A


2/ Code VBA để coppy sau VD: Sheet 2
Khi ta dang Mở Sheet2 File A ở Sheet 2 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet2 File C những cột A,B,C,D,E,F,G,H,I,K Nếu thỏa cột C Không có chữ "HQ" vào Sheet2 File A

3/ Code VBA để coppy sau VD: Sheet 3
Khi dang lam viec o Sheet3 FileA có các hàng dữ liệu liền nhau có các cột A,B,C,D,E và trong sheet đó có nút Coppy. Nếu Click vào nút Coppy mà thỏa mãn 2 điều kiện sau:
- Dieu kien 1: cột A trong Sheet3 FileC và cột A Sheet3 FileA (sheet và file hiện thời làm việc) có số số liệu trùng nhau.
- Dieu kien 2: cột F trong Sheet3 FileC không có dấu "x"
thì sẽ coppy các dữ liệu của các hàng ở Cột C,D,E của Sheet3 FileC sang các cột C,D,E của Sheet3 FileA
(lưu ý giúp: dữ liệu hãng ở Sheet3 FileA có thể ko liền nhau)

4/ Code VBA trong Form VD: Sheet 4
Trong 1 Form có 2 text boxt sau:
Text boxt 1, Text boxt 2
Khi nhập dữ liệu vào Text boxt 1 bấm enter thì Text boxt 2 ktra 3 ký tự đầu của
Text boxt 1 nếu có 3 chữ "kle" thì Text boxt 2 sẽ tự điền là "kh" còn ko có Text boxt 2 sẽ điền "nhà xe"
 

File đính kèm

  • FileA.xlsx
    55.6 KB · Đọc: 2
  • FileC.xlsx
    12.8 KB · Đọc: 1
Upvote 0
Em nhờ các bác giúp 4 trường hợp sau giúp:


1/ Code VBA để coppy sau VD: Sheet 1
Khi ta dang Mở File A ở Sheet 1 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet1 File C những cột A,B,C,D Nếu thỏa cột B có chữ "nhà xe" vào Sheet1 File A


2/ Code VBA để coppy sau VD: Sheet 2
Khi ta dang Mở Sheet2 File A ở Sheet 2 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet2 File C những cột A,B,C,D,E,F,G,H,I,K Nếu thỏa cột C Không có chữ "HQ" vào Sheet2 File A

3/ Code VBA để coppy sau VD: Sheet 3
Khi dang lam viec o Sheet3 FileA có các hàng dữ liệu liền nhau có các cột A,B,C,D,E và trong sheet đó có nút Coppy. Nếu Click vào nút Coppy mà thỏa mãn 2 điều kiện sau:
- Dieu kien 1: cột A trong Sheet3 FileC và cột A Sheet3 FileA (sheet và file hiện thời làm việc) có số số liệu trùng nhau.
- Dieu kien 2: cột F trong Sheet3 FileC không có dấu "x"
thì sẽ coppy các dữ liệu của các hàng ở Cột C,D,E của Sheet3 FileC sang các cột C,D,E của Sheet3 FileA
(lưu ý giúp: dữ liệu hãng ở Sheet3 FileA có thể ko liền nhau)

4/ Code VBA trong Form VD: Sheet 4
Trong 1 Form có 2 text boxt sau:
Text boxt 1, Text boxt 2
Khi nhập dữ liệu vào Text boxt 1 bấm enter thì Text boxt 2 ktra 3 ký tự đầu của
Text boxt 1 nếu có 3 chữ "kle" thì Text boxt 2 sẽ tự điền là "kh" còn ko có Text boxt 2 sẽ điền "nhà xe"
Anh đọc lại nội quy đăng bài nhé. "2. Không được viết một câu hỏi nhiều lần hay gửi cùng một câu hỏi trong nhiều box khác nhau. Khi câu hỏi chưa được trả lời thì không có nghĩa là không ai biết thông tin liên quan đến câu hỏi của bạn và mọi người đang tìm thông tin để trả lời cho câu hỏi đó. "
Câu hỏi của anh em đã trả lời ở bên kia rồi.
 
Upvote 0
Vì có những vẫn đề phát sinh và gửi nhầm sang chủ đề Form nên em xin gửi lại ở đây nhờ các bác giúp 3 trường hợp sau giúp:

1/ Code VBA để coppy sau VD: Sheet 1

Khi ta dang Mở File A ở Sheet1 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet4 File C những cột A,B,C,D Nếu thỏa 2 điều kiện sau:
1/ cột B ở Sheet4 FileC có chữ "nhà xe"
2/ Nếu Sheet1 FileA cột A,C,D có thông tin trùng nhau thì Coppy đè lên cái đã có ở Sheet1 File A

(Lưu ý: Làm sao ko cần mở file mà vẫn coppy được)


2/ Code VBA để coppy sau VD: Sheet 2

Khi ta dang Mở Sheet2 File A ở Sheet2 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet5 File C những cột A,B,C,D,E,F,G,H,I,K Nếu thỏa mãn cột C Không có chữ "HQ" vào Sheet2 File A => Để ko coppy nhiều lần nếu cột B,C,E của FileA trùng với dữ liệu sẽ coppy ở FileC sang thì sẽ ghi đè lên Sheet2 ở FileA

(Lưu ý: Làm sao ko cần mở file mà vẫn coppy được)


3/ Code VBA để coppy sau VD: Sheet 3

Khi dang lam viec o Sheet3 FileA có các hàng dữ liệu liền nhau có các cột A,B,C,D,E,F,G,H,I,J,K và trong sheet đó có nút Coppy. Nếu Click vào nút Coppy mà thỏa mãn 2 điều kiện sau:
- Dieu kien 1: cột B trong Sheet6 FileC và cột A Sheet3 FileA (sheet và file hiện thời làm việc) có số liệu trùng nhau.
- Dieu kien 2: cột F trong Sheet6 FileC ở cột F, K không có dấu "x"
thì sẽ coppy các dữ liệu của các hàng ở Cột D,E,F,H,I,J của Sheet6 FileC sang các cột C,D,E, H,I,J của Sheet3 FileA
(lưu ý giúp: dữ liệu hãng ở Sheet3 FileA có thể ko liền nhau)

(Lưu ý: Làm sao ko cần mở file mà vẫn coppy được)

Rất mong được giúp đỡ vì em rất cần. Tks
 

File đính kèm

  • FileA.xlsx
    56.3 KB · Đọc: 6
  • FileC.xlsx
    13.2 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Vì có những vẫn đề phát sinh và gửi nhầm sang chủ đề Form nên em xin gửi lại ở đây nhờ các bác giúp 3 trường hợp sau giúp:

1/ Code VBA để coppy sau VD: Sheet 1

Khi ta dang Mở File A ở Sheet1 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet4 File C những cột A,B,C,D Nếu thỏa 2 điều kiện sau:
1/ cột B ở Sheet4 FileC có chữ "nhà xe"
2/ Nếu Sheet1 FileA cột A,C,D có thông tin trùng nhau thì Coppy đè lên cái đã có ở Sheet1 File A

(Lưu ý: Làm sao ko cần mở file mà vẫn coppy được)


2/ Code VBA để coppy sau VD: Sheet 2

Khi ta dang Mở Sheet2 File A ở Sheet2 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet5 File C những cột A,B,C,D,E,F,G,H,I,K Nếu thỏa mãn cột C Không có chữ "HQ" vào Sheet2 File A => Để ko coppy nhiều lần nếu cột B,C,E của FileA trùng với dữ liệu sẽ coppy ở FileC sang thì sẽ ghi đè lên Sheet2 ở FileA

(Lưu ý: Làm sao ko cần mở file mà vẫn coppy được)


3/ Code VBA để coppy sau VD: Sheet 3

Khi dang lam viec o Sheet3 FileA có các hàng dữ liệu liền nhau có các cột A,B,C,D,E,F,G,H,I,J,K và trong sheet đó có nút Coppy. Nếu Click vào nút Coppy mà thỏa mãn 2 điều kiện sau:
- Dieu kien 1: cột B trong Sheet6 FileC và cột A Sheet3 FileA (sheet và file hiện thời làm việc) có số liệu trùng nhau.
- Dieu kien 2: cột F trong Sheet6 FileC ở cột F, K không có dấu "x"
thì sẽ coppy các dữ liệu của các hàng ở Cột D,E,F,H,I,J của Sheet6 FileC sang các cột C,D,E, H,I,J của Sheet3 FileA
(lưu ý giúp: dữ liệu hãng ở Sheet3 FileA có thể ko liền nhau)

(Lưu ý: Làm sao ko cần mở file mà vẫn coppy được)

Rất mong được giúp đỡ vì em rất cần. Tks
rất mong được sự giúp đỡ. tks
 
Upvote 0
Chào anh chị! em hỏi về vòng for
cho em xin code về vòng for i = "chọn nhiều ô cell". VD vòng for mình muốn chạy thì chọn ô A1, A5, A7, A8 hoặc quét 1 dãy từ A1~A10 ở những ô đó lấy được giá trị cho vào vòng for
 
Upvote 0
Chào anh chị! em hỏi về vòng for
cho em xin code về vòng for i = "chọn nhiều ô cell". VD vòng for mình muốn chạy thì chọn ô A1, A5, A7, A8 hoặc quét 1 dãy từ A1~A10 ở những ô đó lấy được giá trị cho vào vòng for
Mã:
Sub test()
Dim cell_ As Range
    For Each cell_ In Application.Selection
'        ...
    Next cell_
End Sub
 
Upvote 0
Mã:
Sub test()
Dim cell_ As Range
    For Each cell_ In Application.Selection
'        ...
    Next cell_
End Sub
Xem hộ em lỗi đâu không in được
Mã:
Sub InBB_PhieuBeTong()
    Dim sRng As Range
    Dim Ws As Worksheet
    ActiveSheet.DisplayPageBreaks = False
    
    'On Error GoTo Thoat
    Set sRng = Application.InputBox(Prompt:="Chon Du liêu IN", Title:="Vùng Data", Type:=8)
    For Each sRng In Selection
        Sheets("6.Ctiet BT").Select
        With Ws
            ActiveSheet.DisplayPageBreaks = False
            .Range("AZ1").Value = sRng.Value
            .PrintOut 'Vùng in Set
            End With
    Next sRng
'Thoat:
    ActiveSheet.DisplayPageBreaks = False
End Sub
 

File đính kèm

  • Untitled.png
    Untitled.png
    97.7 KB · Đọc: 12
  • Phieu be tong.xlsm
    480.7 KB · Đọc: 4
Upvote 0
Xem hộ em lỗi đâu không in được
Mã:
Sub InBB_PhieuBeTong()
    Dim sRng As Range
    Dim Ws As Worksheet
    ActiveSheet.DisplayPageBreaks = False
   
    'On Error GoTo Thoat
    Set sRng = Application.InputBox(Prompt:="Chon Du liêu IN", Title:="Vùng Data", Type:=8)
    For Each sRng In Selection
        Sheets("6.Ctiet BT").Select
        With Ws
            ActiveSheet.DisplayPageBreaks = False
            .Range("AZ1").Value = sRng.Value
            .PrintOut 'Vùng in Set
            End With
    Next sRng
'Thoat:
    ActiveSheet.DisplayPageBreaks = False
End Sub
Bạn sửa thành for each t in srng thì được.trong đó t là 1 biến range.và thay câu lệnh ở dưới là biến t nhé.
 
Upvote 0
Xem hộ em lỗi đâu không in được
Mã:
Sub InBB_PhieuBeTong()
    Dim sRng As Range
    Dim Ws As Worksheet
    ActiveSheet.DisplayPageBreaks = False
  
    'On Error GoTo Thoat
    Set sRng = Application.InputBox(Prompt:="Chon Du liêu IN", Title:="Vùng Data", Type:=8)
    For Each sRng In Selection
        Sheets("6.Ctiet BT").Select
        With Ws
            ActiveSheet.DisplayPageBreaks = False
            .Range("AZ1").Value = sRng.Value
            .PrintOut 'Vùng in Set
            End With
    Next sRng
'Thoat:
    ActiveSheet.DisplayPageBreaks = False
End Sub
1. Nếu trước khi nhấn nút mà ô vd. BB64 đang được chọn thì Selection trong For Each sRng In Selection nó là 1 ô BB64 chứ không phải 2 ô vừa chọn ở 6.DV BT
2. Nếu đã chọn bằng InputBox thì các ô được chọn nó ở trong sRng rồi, sao lại dùng Selection?
3.
Mã:
With Ws
    ActiveSheet.DisplayPageBreaks = False
    .Range("AZ1").Value = sRng.Value
    .PrintOut 'Vůng in Set
End With

Chưa có SET nên Ws là Nothing và do vậy sẽ có lỗi tại
Mã:
.Range("AZ1").Value = sRng.Value
.PrintOut 'Vůng in Set
Cũng có thể không dùng Ws và SET mà dùng With Sheets("6.Ctiet BT")

4. Hãy hạn chế SELECT kiểu Sheets("6.Ctiet BT").Select. Không cần thiết.

Mã:
Sub InBB_PhieuBeTong()
    Dim sRng As Range, cell_ As Range
    'On Error GoTo Thoat
    ActiveSheet.DisplayPageBreaks = False
    Set sRng = Application.InputBox(Prompt:="Chon Du lięu IN", Title:="Vůng Data", Type:=8)
    For Each cell_ In sRng
        With Sheets("6.Ctiet BT")
            .Range("AZ1").Value = cell_.Value
            .PrintOut 'Vůng in Set
        End With
    Next cell_
'Thoat:
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn sửa thành for each t in srng thì được.trong đó t là 1 biến range.và thay câu lệnh ở dưới là biến t nhé.
Thực ra vụ For Each sRng In Selection chỉ là nhập nhầm giá trị ô vào AZ1. Ví dụ trước khi nhấn nút mà BB64 được chọn thì Selection là BB64 và giá trị của BB64 sẽ được nhập vào AZ1. Nhưng đây là lỗi "kết quả không như mong đợi". Còn lỗi thực sự, lỗi thực hiện, "cho đi về với cát bụi" là lỗi do chưa có SET nên Ws = Nothing. Lúc đó thực hiện
Mã:
.Range("AZ1").Value = ...
.PrintOut 'Vůng in Set
sẽ có lỗi "đột quỵ"
 
Upvote 0
1. Nếu trước khi nhấn nút mà ô vd. BB64 đang được chọn thì Selection trong For Each sRng In Selection nó là 1 ô BB64 chứ không phải 2 ô vừa chọn ở 6.DV BT
2. Nếu đã chọn bằng InputBox thì các ô được chọn nó ở trong sRng rồi, sao lại dùng Selection?
3.
Mã:
With Ws
    ActiveSheet.DisplayPageBreaks = False
    .Range("AZ1").Value = sRng.Value
    .PrintOut 'Vůng in Set
End With

Chưa có SET nên Ws là Nothing và do vậy sẽ có lỗi tại
Mã:
.Range("AZ1").Value = sRng.Value
.PrintOut 'Vůng in Set
Cũng có thể không dùng Ws và SET mà dùng With Sheets("6.Ctiet BT")

4. Hãy hạn chế SELECT kiểu Sheets("6.Ctiet BT").Select. Không cần thiết.

Mã:
Sub InBB_PhieuBeTong()
    Dim sRng As Range, cell_ As Range
    'On Error GoTo Thoat
    ActiveSheet.DisplayPageBreaks = False
    Set sRng = Application.InputBox(Prompt:="Chon Du lięu IN", Title:="Vůng Data", Type:=8)
    For Each cell_ In sRng
        With Sheets("6.Ctiet BT")
            .Range("AZ1").Value = cell_.Value
            .PrintOut 'Vůng in Set
        End With
    Next cell_
'Thoat:
End Sub
Được rồi anh à!, em cũng quên toàn dùng Sheets("6.Ctiet BT").Select Các anh cũng nhắc mà em quên mất
 
Upvote 0
Kính nhờ anh chị sửa giúp code trong file đính kèm ạ. E đang muốn tách từ dòng thứ 3 nhưng file tách này đang tách từ dòng 1
 

File đính kèm

  • Copy of Tachvagui new PLN.xlsm
    39.9 KB · Đọc: 4
Upvote 0
Các bác cho mỉnh tí với.
Tình hình là mình có 1 bảng dữ liệu excel. Mình muốn từ bảng đấy mình mở 1 file word mà mình muốn merge đến vị trí mình mong muốn được không vậy.
Thanks các bác ạ!
 
Upvote 0
Các bác cho mỉnh tí với.
Tình hình là mình có 1 bảng dữ liệu excel. Mình muốn từ bảng đấy mình mở 1 file word mà mình muốn merge đến vị trí mình mong muốn được không vậy.
Cảm ơn các bác ạ!
Đính kèm tập tin rồi dựa vào nó mô tả công việc. Làm gì, khi nào, như thế nào v...v thì may có người giúp. Còn nếu chỉ là một chút nước bọt thì chịu.
Nếu chỉ muốn câu trả lời "được" hay "không được" thì "được".
 
Upvote 0
Chào mọi người ạ,

Em đang làm 1 file excel có thể tự nhập những thông tin vào sheet "Hàng xuất" từ sheet "Phiếu xuất hàng" khi nhấn nút "Lưu"
Nhưng khi em chạy thử thì nó bị lỗi này ạ "Compile error: Variable not defined"

Mong mọi người hướng dẫn em với ạ! Em xin cảm ơn!!

Code em làm theo hướng dẫn trên mạng ạ! EM CÓ ĐÍNH KÈM FILE MẪU VÀ HÌNH ẢNH


Mã:
Option Explicit

Sub Lenh_Luu()

With Sheet1

'Mo khoa sheet

    .Unprotect

'Tim dong tiep theo trong bang xuat kho

    Dim Dongcuoi As Long

        Dongcuoi = Sheet1.Cells(Rows.Count, 1).End(x1Up).Row + 1  'Dong cuoi cot A

'Luu noi dung vao cac cot

    Cells(Dongcuoi, 1).Value = Sheet2.Cells(15, 1).Value  'Ma Don

    Cells(Dongcuoi, 2).Value = Sheet2.Cells(15, 2).Value  'Ngay

    Cells(Dongcuoi, 3).Value = Sheet2.Cells(15, 3).Value  'Ma KH

    Cells(Dongcuoi, 4).Value = Sheet2.Cells(15, 4).Value  'Nguoi nhan hang

    Cells(Dongcuoi, 5).Value = Sheet2.Cells(15, 5).Value  'STT

    Cells(Dongcuoi, 6).Value = Sheet2.Cells(15, 6).Value  'Ma So

    Cells(Dongcuoi, 7).Value = Sheet2.Cells(15, 7).Value  'Ten San Pham

    Cells(Dongcuoi, 8).Value = Sheet2.Cells(15, 8).Value  'So Luong

    Cells(Dongcuoi, 9).Value = Sheet2.Cells(15, 9).Value  'Don Gia

    Cells(Dongcuoi, 10).Value = Sheet2.Cells(15, 10).Value  'Thanh Tien

    Cells(Dongcuoi, 11).Value = Sheet2.Cells(15, 11).Value  'Ghi Chu

'Khoa sheet

    .Protect

End With

'Thong bao hoan thanh

MsgBox "Luu thanh cong"

End Sub
 

File đính kèm

  • Codes.png
    Codes.png
    204.3 KB · Đọc: 5
  • Lỗi 1.png
    Lỗi 1.png
    222.2 KB · Đọc: 7
  • Lỗi 2.png
    Lỗi 2.png
    204.7 KB · Đọc: 6
  • Test 2.xlsm
    1.5 MB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom