Chuyên đề giải đáp những thắc mắc về code VBA (6 người xem)

Liên hệ QC

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

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:
Đây làm một hàm để so sánh số lớn nhất trong một vùng dữ liệu (Range) nào đó.

Nó căn cứ từ ô đầu tiên của vùng [ Ran.Cells(1, 1) ] làm chuẩn để so sánh với các ô trong vùng đó.

Với câu lệnh này:

If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)

Với d đại diện cho hàng và c đại diện cho cột, khi vòng lặp chạy lần lượt đến mỗi ô trong Vùng tham chiếu, nếu gặp ô có giá trị lớn hơn giá trị ban đầu max = Ran.Cells(1, 1) thì max sẽ nhận giá trị tại ô đó rồi tiếp tục so sánh sang ô khác, còn không thì nó vẫn giữ giá trị lớn nhất.

=============================
Cái mà tôi không hiểu gì trong hàm đó là cái này:

v = Tim(max, Ran)

Chả biết nó dùng để làm gì nữa!
 
Lần chỉnh sửa cuối:
Upvote 0
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
Anh Hoàng Trọng Nghĩa đã giải thích cho bạn về Rows.count,Columns.count và câu lệnh if.... then ở trên rồi, ở đây mình muốn hỏi thêm :
Cái V=Tim(max,Ran) để làm gì vậy bạn, vì sau khi function Lonnhat kết thúc,biến V sẽ được giải phóng ra khỏi bộ nhớ !
Còn nếu tìm giá trị max trong 1 vùng mình sửa lại code cho bạn dễ hiểu như sau :
PHP:
Public Function Lonnhat(Ran As Range) As Double    
Dim mycell As Range       
 For Each mycell In Ran           
     If Val(mycell) > Lonnhat Then Lonnhat = mycell       
 Next
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Cái V=Tim(max,Ran) để làm gì vậy bạn, vì sau khi function Lonnhat kết thúc,biến V sẽ được giải phóng ra khỏi bộ nhớ !
Còn nếu tìm giá trị max trong 1 vùng mình sửa lại code cho bạn dễ hiểu như sau :
PHP:
Public Function Lonnhat(Ran As Range) As Double    
Dim mycell As Range       
 For Each mycell In Ran           
     If Val(mycell) > Lonnhat Then Lonnhat = mycell       
 Next
End Function


Giả sử vùng có 3 ô: A1:A3

A1 là trống, A2 là -1 và A3 là -2 vậy theo bạn, ô nào là Max?

Thử làm với hàm bạn, ra giá trị là bao nhiêu?
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Lại bị anh Nghĩa "cốc" vào đâu rồi -+*/, ^^ quên mất là phải thêm điều kiện và chỉnh sửa tẹo nữa --=0
Thanks anh !

Để học thuật hay làm một việc gì đó ngoài Excel thì mình làm hàm tự tạo MAX, còn không thì cứ dùng MAX trong sheet và WorksheetFunction.Max trong VBA là tốt nhất, tôi nghĩ là vậy.
 
Upvote 0
Để học thuật hay làm một việc gì đó ngoài Excel thì mình làm hàm tự tạo MAX, còn không thì cứ dùng MAX trong sheet và WorksheetFunction.Max trong VBA là tốt nhất, tôi nghĩ là vậy.

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à đủ
 
Upvote 0
#2 ,#3
v = Tim(max, Ran)
Là mình gọi thủ tục cho biết vị trí của số lớn nhất trong bảng đã tìm thấy trong bảng bạn a. Nhưng thủ tục đó mình ko đưa vào đây.
 
Lần chỉnh sửa cuối:
Upvote 0
Giả sử vùng có 3 ô: A1:A3

A1 là trống, A2 là -1 và A3 là -2 vậy theo bạn, ô nào là Max?

Thử làm với hàm bạn, ra giá trị là bao nhiêu?
cho mình hởi thêm với: Giá trị của "lonnhat" khi bắt đầu chạy vòng lặp for each đầu tiên có giá trị la bao nhiêu vậy ban?
Có phải ban đầu nó bằng 0 không vây?
 
Upvote 0
cho mình hởi thêm với: Giá trị của "lonnhat" khi bắt đầu chạy vòng lặp for each đầu tiên có giá trị la bao nhiêu vậy ban?
Có phải ban đầu nó bằng 0 không vây?
Chính xác ban đầu giá trị = 0 , mà vụ này bạn dùng worksheetFunction.Max(ran) là được mà !

p/s : bạn mới vào diễn đàn, + mới học vba , mình có chút kinh nghiệm học tập chia sẻ như sau :
*các cụ có câu "học thầy không tày học bạn " <--- bạn cố gắng giao lưu , nhiệt tình , sôi nổi trên GPE,
* Anh ndu và anh Nghĩa là các thành viên có tên tuổi và số má trên diễn đàn, những bài viết nhận xét ,góp ý của các anh ý đều có giá trị nhất định đấy bạn ah
 
Upvote 0
Các anh chị giúp em với.
Nhờ các anh chị giải thích code của hàm sau với:

Private Declare Function GetMeID Lib "excelqt.dll" (ByVal RT As String) As Integer
Declare Function GetActiveWindow Lib "user32" () As Long

Function ThongtinKTXD(ByVal ODIA As String, SOHDDSR As Integer) As String
Dim Serial As String
Dim ret As Integer
Serial = Space$(256)
ret = GetMeID(Serial)
If SOHDDSR = 13971 Then
ThongtinKTXD = Serial
ThongtinKTXD = Trim(ThongtinKTXD)
Else
ThongtinKTXD = ""
End If
End Function

Function NumberWindow() As Long
Dim NumberWND As Long
NumberWindow = GetActiveWindow()
End Function
http://www.giaiphapexcel.com/forum/...-các-code-đề-nghị-các-bạn-gửi-vào-đây/page154
em gửi bài bên đây nhưng được biết đề tài dài quá nên anh ndu96081631 chuyển sang đây. Hôm trước anh ndu96081631 có nói về file EXCELQT.DLL nên em gửi file lên nhờ các anh, chị chỉ giúp. hoặc giúp em có thể làm 1 file giống vậy ko?
 
Upvote 0
Nhờ các Bác chỉ lỗi E sai chỗ nào với.

Em có đoạn code này, trong file đính kèm. Không hiểu sao lỗi, nhờ các Bác chỉ giúp với.

Mã:
Sub ghiDL()'
' ghiDL Macro
'


    Dim MyArr As Variant
    With Sheets("Nhap")
        MyArr = Array(.[C4], .[C5], .[c6], .[c7], .[c8], "=(RC[-3]+RC[-2]+RC[-1])/3", "=IF(RC[-1]>8;"Gi?i";IF(AND(RC[-1]<=8;RC[-1]>5);"TB";"Kém"))")
    End With
    Sheets("DL").Range("A65536").End(xlUp).Offset(1).Resize(, 7).Value = MyArr
End Sub

File của E đây ạ.
 

File đính kèm

Upvote 0
Hình như khi gán công thức IF vào thì bị lỗi hay sao ấy ạ. Không biết chuyển công thức IF ở excel sang VBA thì thay thế bằng hàm gì nhỉ..?
 
Upvote 0
Hình như khi gán công thức IF vào thì bị lỗi hay sao ấy ạ. Không biết chuyển công thức IF ở excel sang VBA thì thay thế bằng hàm gì nhỉ..?

* Bạn thử record macro Hàm if() ---> sẽ suy ra cách viết trong vba ( cụ thể ở đây bạn thiếu dấu "")
* Sau khi sửa được câu lệnh if, bạn sẽ gặp lỗi khi gán giá trị xuống sheet bằng câu lệnh :....=MyArr , vì trong mảng của bạn chứa 2 kiểu : 1 kiểu là range.value và 1 kiểu là range.formulaR1C1 sao mà được
 
Upvote 0
Nhờ sửa đoạn code Sub Copy() sau vì nó không copy ra 6 bảng

Sub Copy()
On Error Resume Next
Dim List, Mg1, Mg2, Mg3, Mg4, i, j, r, c, t, n

Application.ThisWorkbook.Active
Sheets("Sheet1").Select
Cells.Find("Data*", ActiveCell, xlValues, xlWhole).Offset(2).Select
Rlist = ActiveCell.Row
CList = ActiveCell.Column
EndColn = Range("CA" & Rlist).End(xlToLeft).Column
'List = Cells(Rlist, CList).Resize(100, 50)
List = Cells(Rlist, CList).CurrentRegion
ReDim Mg1(1 To UBound(List), 1 To EndColn)
ReDim Mg2(1 To UBound(List), 1 To EndColn)
ReDim Mg3(1 To UBound(List), 1 To EndColn)
ReDim Mg4(1 To UBound(List), 1 To EndColn)
For i = 1 To UBound(List)
For j = 1 To EndColn
t = i Mod 12
n = j Mod 6
If t = 1 And n = 1 Or t = 1 And n = 2 _
Or t = 2 And n = 1 _
Or t = 4 And n = 3 Or t = 4 And n = 0 _
Or t = 5 And n = 3 Then
r = i
c = j
Mg1(r, c) = List(i, j)
End If
If t = 1 And n = 3 Or t = 1 And n = 0 _
Or t = 2 And n = 3 _
Or t = 4 And n = 1 Or t = 4 And n = 2 _
Or t = 5 And n = 1 Then
r = i
c = j
Mg2(r, c) = List(i, j)
End If
If t = 2 And n = 2 _
Or t = 3 And n = 1 Or t = 3 And n = 2 _
Or t = 5 And n = 0 _
Or t = 0 And n = 3 Or t = 0 And n = 0 _
Then
r = i
c = j
Mg3(r, c) = List(i, j)
End If
If t = 2 And n = 0 _
Or t = 3 And n = 3 Or t = 3 And n = 0 _
Or t = 5 And n = 2 _
Or t = 0 And n = 1 Or t = 0 And n = 2 Then
r = i
c = j
Mg4(r, c) = List(i, j)
End If
Next j
Next i
ThisWorkbook.Sheets("Sheet2").Select
Range("A1").Select
With Selection
.Resize(2000, 60).ClearContents
.Resize(2000, 60).ClearFormats
End With
Range("A65000").End(xlUp).Offset(1).Value = "Data 1"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg1
Range("A65000").End(xlUp).Offset(1).Value = "Data 2"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg2
Range("A65000").End(xlUp).Offset(1).Value = "Data 3"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg3
Range("A65000").End(xlUp).Offset(1).Value = "Data 4"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg4
End Sub

Tôi có kèm file rất mong các thầy giúp đỡ
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ sửa đoạn code Sub Copy() sau vì nó không copy ra 6 bảng
Tôi có kèm file rất mong các thầy giúp đỡ

Mục tiêu của bạn làm gì,
Tôi nghi ngờ các vấn đề bạn nhờ là nhằm mục đích lạ, và liên quan đến số???

Nếu bạn không nói rõ ứng dụng thực tế thì đây là những vấn đề vô bổ , có lẽ mọi người cần cân nhắc khi giúp
 
Upvote 0
Sub Copy()
On Error Resume Next
Dim List, Mg1, Mg2, Mg3, Mg4, i, j, r, c, t, n

Application.ThisWorkbook.Active
Sheets("Sheet1").Select
Cells.Find("Data*", ActiveCell, xlValues, xlWhole).Offset(2).Select
Rlist = ActiveCell.Row
CList = ActiveCell.Column
EndColn = Range("CA" & Rlist).End(xlToLeft).Column
'List = Cells(Rlist, CList).Resize(100, 50)
List = Cells(Rlist, CList).CurrentRegion
ReDim Mg1(1 To UBound(List), 1 To EndColn)
ReDim Mg2(1 To UBound(List), 1 To EndColn)
ReDim Mg3(1 To UBound(List), 1 To EndColn)
ReDim Mg4(1 To UBound(List), 1 To EndColn)
For i = 1 To UBound(List)
For j = 1 To EndColn
t = i Mod 12
n = j Mod 6
If t = 1 And n = 1 Or t = 1 And n = 2 _
Or t = 2 And n = 1 _
Or t = 4 And n = 3 Or t = 4 And n = 0 _
Or t = 5 And n = 3 Then
r = i
c = j
Mg1(r, c) = List(i, j)
End If
If t = 1 And n = 3 Or t = 1 And n = 0 _
Or t = 2 And n = 3 _
Or t = 4 And n = 1 Or t = 4 And n = 2 _
Or t = 5 And n = 1 Then
r = i
c = j
Mg2(r, c) = List(i, j)
End If
If t = 2 And n = 2 _
Or t = 3 And n = 1 Or t = 3 And n = 2 _
Or t = 5 And n = 0 _
Or t = 0 And n = 3 Or t = 0 And n = 0 _
Then
r = i
c = j
Mg3(r, c) = List(i, j)
End If
If t = 2 And n = 0 _
Or t = 3 And n = 3 Or t = 3 And n = 0 _
Or t = 5 And n = 2 _
Or t = 0 And n = 1 Or t = 0 And n = 2 Then
r = i
c = j
Mg4(r, c) = List(i, j)
End If
Next j
Next i
ThisWorkbook.Sheets("Sheet2").Select
Range("A1").Select
With Selection
.Resize(2000, 60).ClearContents
.Resize(2000, 60).ClearFormats
End With
Range("A65000").End(xlUp).Offset(1).Value = "Data 1"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg1
Range("A65000").End(xlUp).Offset(1).Value = "Data 2"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg2
Range("A65000").End(xlUp).Offset(1).Value = "Data 3"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg3
Range("A65000").End(xlUp).Offset(1).Value = "Data 4"
Range("A65000").End(xlUp).Offset(1).Resize(i, j) = Mg4
End Sub

Tôi có kèm file rất mong các thầy giúp đỡ
Đoạn code trên là do tôi viết trong tình trạng đoán già đoán non mong muốn của bạn ở 1 Topic khác, yêu cầu thêm sau của bạn cũng đã được tôi giải quyết ngay tại Topic đó và còn nhiều người khác cũng đã trả lời bạn. Khó hiểu bạn muốn gì
 
Upvote 0
Đoạn code trên là do tôi viết trong tình trạng đoán già đoán non mong muốn của bạn ở 1 Topic khác, yêu cầu thêm sau của bạn cũng đã được tôi giải quyết ngay tại Topic đó và còn nhiều người khác cũng đã trả lời bạn. Khó hiểu bạn muốn gì
Không phải đâu bạn ah, vì tôi gửi topic nọ bị teo nick không có người tham gia nên cực chẳng đã rồi gửi thêm bài thôi. Mong anh chị thông cảm, tuyệt nhiên không có ý gì
.......Cũng vì phải ham Excel nên thông cảm thông cảm cho em
 
Lần chỉnh sửa cuối:
Upvote 0
Mục tiêu của bạn làm gì,
Tôi nghi ngờ các vấn đề bạn nhờ là nhằm mục đích lạ, và liên quan đến số???

Nếu bạn không nói rõ ứng dụng thực tế thì đây là những vấn đề vô bổ , có lẽ mọi người cần cân nhắc khi giúp
Vodoi2x hôm nay sao vầy, từ khi vào diễn đàn thấy bài của Bác nên tôi cũng mê tài của Bác, Bác thấy tôi chưa có 01 bài nào gây cho ai khó chịu cả nghe Bác. Chúc bác vui vẻ, vụ gì cũng khỏe hi..hii. đừng nghỉ xấu em
 
Upvote 0
Vodoi2x hôm nay sao vầy, từ khi vào diễn đàn thấy bài của Bác nên tôi cũng mê tài của Bác, Bác thấy tôi chưa có 01 bài nào gây cho ai khó chịu cả nghe Bác. Chúc bác vui vẻ, vụ gì cũng khỏe hi..hii. đừng nghỉ xấu em

Không sao cả, bạn nhầm rùi,

Tôi cố tình nói thế để bạn nhận ra: phải nêu rõ chi tiết vấn đề mình, thực tế áp dụng - tại sao chọn thế - như bài này bạn cứ tô màu loạn lên --> rui để mọi người làm , và copy - gây khó hiểu và mục đích không rõ ràng

Vậy thui, bạn nghĩ có thấy thế không?
 
Upvote 0
Giúp làm ngắn đoạn code này

Nhờ các bạn trên diễn đàn giúp mình làm ngắn đoạn code này và khoa học hơn với.
mục đích của đoạn code này là kiểm tra tất cả các cột trong query "QR01_TKH_Import" có S=0 thì Hide những cột L tương ứng!
Mã:
Private Sub PO_AfterUpdate()
On Error GoTo loi
    If (DLookup("S01", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L01.Properties("ColumnHidden") = True
    Else
        L01.Properties("ColumnHidden") = False
    End If
    If (DLookup("S02", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L02.Properties("ColumnHidden") = True
    Else
        L02.Properties("ColumnHidden") = False
    End If
    If (DLookup("S03", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L03.Properties("ColumnHidden") = True
    Else
        L03.Properties("ColumnHidden") = False
    End If
    If (DLookup("S04", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L04.Properties("ColumnHidden") = True
    Else
        L04.Properties("ColumnHidden") = False
    End If
    If (DLookup("S05", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L05.Properties("ColumnHidden") = True
    Else
        L05.Properties("ColumnHidden") = True
    End If
    If (DLookup("S06", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L06.Properties("ColumnHidden") = True
    Else
        L06.Properties("ColumnHidden") = True
    End If
    If (DLookup("S07", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L07.Properties("ColumnHidden") = True
    Else
        L07.Properties("ColumnHidden") = True
    End If
    If (DLookup("S08", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L08.Properties("ColumnHidden") = True
    Else
        L08.Properties("ColumnHidden") = True
    End If
    If (DLookup("S09", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L09.Properties("ColumnHidden") = True
    Else
        L09.Properties("ColumnHidden") = True
    End If
    If (DLookup("S10", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L10.Properties("ColumnHidden") = True
    Else
        L10.Properties("ColumnHidden") = True
    End If
    If (DLookup("S11", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L11.Properties("ColumnHidden") = True
    Else
        L11.Properties("ColumnHidden") = True
    End If
    If (DLookup("S12", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L12.Properties("ColumnHidden") = True
    Else
        L12.Properties("ColumnHidden") = True
    End If
    If (DLookup("S13", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L13.Properties("ColumnHidden") = True
    Else
        L13.Properties("ColumnHidden") = True
    End If
    If (DLookup("S14", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L14.Properties("ColumnHidden") = True
    Else
        L14.Properties("ColumnHidden") = True
    End If
    If (DLookup("S15", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L15.Properties("ColumnHidden") = True
    Else
        L15.Properties("ColumnHidden") = True
    End If
    If (DLookup("S16", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L16.Properties("ColumnHidden") = True
    Else
        L16.Properties("ColumnHidden") = True
    End If
    If (DLookup("S17", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L17.Properties("ColumnHidden") = True
    Else
        L17.Properties("ColumnHidden") = True
    End If
    If (DLookup("S18", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L18.Properties("ColumnHidden") = True
    Else
        L18.Properties("ColumnHidden") = True
    End If
    If (DLookup("S19", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L19.Properties("ColumnHidden") = True
    Else
        L19.Properties("ColumnHidden") = True
    End If
    If (DLookup("S20", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L20.Properties("ColumnHidden") = True
    Else
        L20.Properties("ColumnHidden") = True
    End If
    If (DLookup("S21", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L21.Properties("ColumnHidden") = True
    Else
        L21.Properties("ColumnHidden") = True
    End If
    If (DLookup("S22", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L22.Properties("ColumnHidden") = True
    Else
        L22.Properties("ColumnHidden") = True
    End If
    If (DLookup("S23", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L23.Properties("ColumnHidden") = True
    Else
        L23.Properties("ColumnHidden") = True
    End If
    If (DLookup("S24", "QR01_TKH_Import", "POT='" & POT & "'") = 0) Then
        L24.Properties("ColumnHidden") = True
    Else
        L24.Properties("ColumnHidden") = True
    End If
    If (DLookup("S25", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L25.Properties("ColumnHidden") = True
    Else
        L25.Properties("ColumnHidden") = True
    End If
    If (DLookup("S26", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L26.Properties("ColumnHidden") = True
    Else
        L26.Properties("ColumnHidden") = True
    End If
    If (DLookup("S27", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L27.Properties("ColumnHidden") = True
    Else
        L27.Properties("ColumnHidden") = True
    End If
    If (DLookup("S28", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L28.Properties("ColumnHidden") = True
    Else
        L28.Properties("ColumnHidden") = True
    End If
    If (DLookup("S29", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L29.Properties("ColumnHidden") = True
    Else
        L29.Properties("ColumnHidden") = True
    End If
    If (DLookup("S30", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L30.Properties("ColumnHidden") = True
    Else
        L30.Properties("ColumnHidden") = True
    End If
    If (DLookup("S31", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L31.Properties("ColumnHidden") = True
    Else
        L31.Properties("ColumnHidden") = True
    End If
    If (DLookup("S32", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L32.Properties("ColumnHidden") = True
    Else
        L32.Properties("ColumnHidden") = True
    End If
    If (DLookup("S33", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L33.Properties("ColumnHidden") = True
    Else
        L33.Properties("ColumnHidden") = True
    End If
    If (DLookup("S34", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L34.Properties("ColumnHidden") = True
    Else
        L34.Properties("ColumnHidden") = True
    End If
    If (DLookup("S35", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L35.Properties("ColumnHidden") = True
    Else
        L35.Properties("ColumnHidden") = True
    End If
    If (DLookup("S36", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L36.Properties("ColumnHidden") = True
    Else
        L36.Properties("ColumnHidden") = True
    End If
    If (DLookup("S37", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L37.Properties("ColumnHidden") = True
    Else
        L37.Properties("ColumnHidden") = True
    End If
    If (DLookup("S38", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L38.Properties("ColumnHidden") = True
    Else
        L38.Properties("ColumnHidden") = True
    End If
    If (DLookup("S39", "QR01_TKH_Import", "POT='" & PO & "'") = 0) Then
        L39.Properties("ColumnHidden") = True
    Else
        L39.Properties("ColumnHidden") = True
    End If
    Exit Sub
loi:
    MsgBox Err.Description
End Sub

Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như bạn dùng cho ACCESS thì phải. Bạn thử với cái này xem:

[GPECODE=vb]Private Sub PO_AfterUpdate()
On Error GoTo loi
Dim i As Long, n As String
For i = 1 To 39
n = Format(i, "00")
Fields("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "POT='" & PO & "'") = 0)
Next
Exit Sub
loi:
MsgBox Err.Description
End Sub
[/GPECODE]


===============================================

Không biết code bạn viết có gì đặc biệt không, nhưng từ L05 trở đi thì tất cả các điều kiện cho ra giá trị là TRUE mà không phải là TRUE và FALSE.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình dùng access bạn ơi!

code của bạn bị lổi rồi!
Fields("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "POT='" & PO & "'") = 0)
nhờ bạn xem lại!
 
Upvote 0
Mình dùng access bạn ơi!

code của bạn bị lổi rồi!
Fields("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "POT='" & PO & "'") = 0)
nhờ bạn xem lại!

Trước hết, code của bạn có chạy bị lỗi không? Tôi chỉ căn cứ code của bạn mà rút gọn thôi.

Hay bạn thử gửi cái file đó lên xem sao. Tôi thấy thực tế sẽ dễ dàng thực hiện hơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin nói lại ý đồ của mình là khi mình nhập PO thì tự động nó sẽ dò trong query có số lượng hay không nếu bằng không thì hide cột L tương ứng và cột S tương ứng trong hai sub form!
 

File đính kèm

Upvote 0
Mình xin nói lại ý đồ của mình là khi mình nhập PO thì tự động nó sẽ dò trong query có số lượng hay không nếu bằng không thì hide cột L tương ứng và cột S tương ứng trong hai sub form!

Bạn gửi file lên tôi mới biết được mình phải làm gì. Bây giờ bạn thử chép đoạn code vào trong form bạn xem sao!

Mã:
Private Sub PO_AfterUpdate()
    On Error GoTo loi
    Dim i As Long, n As String
    For i = 1 To 39
        n = Format(i, "00")
        Controls("L" & n).Properties("ColumnHidden") = (DLookup("S" & n, "QR01_TKH_Import", "PO='" & PO & "'") = 0)
    Next
    Exit Sub
loi:
    MsgBox Err.Description
End Sub
 
Upvote 0
Chân thành cảm ơn sự nhiệt tình của bạn!

tiện cho mình hỏi mình muôn hide luôn những cột S* trong form sub _TKH_Import có số liệu =0 được không?
 
Upvote 0
Chân thành cảm ơn sự nhiệt tình của bạn!

tiện cho mình hỏi mình muôn hide luôn những cột S* trong form sub _TKH_Import có số liệu =0 được không?

Được chứ bạn! Bạn chép code này để thay thế cho code trước bạn nhé!

Mã:
Option Compare Database


Private Sub PO_AfterUpdate()
    On Error GoTo loi
    Dim i As Long, n As String
    For i = 1 To 39
        n = Format(i, "00")
        If (DLookup("S" & n, "QR01_TKH_Import", "PO='" & PO & "'") = 0) Then
            Controls("L" & n).Properties("ColumnHidden") = True
            Form_F01_TKH_Import.Controls("S" & n).Properties("ColumnHidden") = True
        Else
            Controls("L" & n).Properties("ColumnHidden") = False
            Form_F01_TKH_Import.Controls("S" & n).Properties("ColumnHidden") = False
        End If
    Next
    Exit Sub
loi:
    MsgBox Err.Description
End Sub

Hoặc muốn ngắn gọn hơn, bạn thêm một biến Boolean vào:

Mã:
Private Sub PO_AfterUpdate()
    On Error GoTo loi
    Dim i As Long, n As String, IsTest As Boolean
    For i = 1 To 39
        n = Format(i, "00")
        IsTest = (DLookup("S" & n, "QR01_TKH_Import", "PO='" & PO & "'") = 0)
        Controls("L" & n).Properties("ColumnHidden") = IsTest
        Form_F01_TKH_Import.Controls("S" & n).Properties("ColumnHidden") = IsTest
    Next
    Exit Sub
loi:
    MsgBox Err.Description
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
* Bạn thử record macro Hàm if() ---> sẽ suy ra cách viết trong vba ( cụ thể ở đây bạn thiếu dấu "")
* Sau khi sửa được câu lệnh if, bạn sẽ gặp lỗi khi gán giá trị xuống sheet bằng câu lệnh :....=MyArr , vì trong mảng của bạn chứa 2 kiểu : 1 kiểu là range.value và 1 kiểu là range.formulaR1C1 sao mà được

Vâng cám ơn Bác, vậy muốn gán Ô để chứa công thức IF đó thì E phải làm như thế nào ạ..? Cụ thể trong bài của E, mỗi lần ghi 1 dòng mới thì ô cuối cùng tự động gán 1 công thức if vào..!
 
Upvote 0
Cho mình hỏi thêm vấn đề như thế này với:
Đoạn code sau mình muốn gán biến "myrange" của mình bằng vùng A2:A20
Set myrange = .Worksheets("sheet1").[2:1 , 20:1]
cho hỏi là cú pháp có sai không vây?
 
Upvote 0
Trời đất. Có vậy mà cũng hỏi. Test thử thì biết liền chứ gì.

Nếu hông biết test thì về học cách dùng Immediate Window cho nhuyễn rồi hãy tiếp tục học code.
 
Upvote 0
Ui đang tập viết code nhưng chưa viết xong. Nhớ mang máng không biết đúng không? thế lại phải tự test ah?
Thế cho mình hỏi nữa là câu lệnh thoát khỏi vòng lập ngay lập tức là gì vây? mình đang dùng vòng for each....
 
Lần chỉnh sửa cuối:
Upvote 0
Ui đang tập viết code nhưng chưa viết xong. Nhớ mang máng ko biết đúng không? thế lại phải tự test ah?

Chứ chẳng lẽ cái gì cũng nhờ
Test thế này:
Mã:
Sub Test
  Dim [B]myrange[/B] as Range
  [B][COLOR=#ff0000]Set myrange = .Worksheets("sheet1").[2:1 , 20:1] [/COLOR] [COLOR=#000000]'<--- Code này của bạn nha (tôi không biết)[/COLOR]
  myrange.Select[/B]
End Sub
Chạy thử, nếu nó chẳng báo lỗi gì và Select 1 vùng nào đó thì cái của bạn ĐÚNG. Bằng ngược lại thì... LÀM LẠI
Thế thôi
 
Upvote 0
Chứ chẳng lẽ cái gì cũng nhờ
Test thế này:
Mã:
Sub Test
  Dim [B]myrange[/B] as Range
  [B][COLOR=#ff0000]Set myrange = .Worksheets("sheet1").[2:1 , 20:1] [/COLOR] [COLOR=#000000]'<--- Code này của bạn nha (tôi không biết)[/COLOR]
  myrange.Select[/B]
End Sub
Chạy thử, nếu nó chẳng báo lỗi gì và Select 1 vùng nào đó thì cái của bạn ĐÚNG. Bằng ngược lại thì... LÀM LẠI
Thế thôi
Đấy giải thích như anh mới dễ làm chứ. Giờ em đã hiểu rùi chỉ cần cho nó vào một thủ tục chỉ có câu lệch đó chạy không thấy báo lỗi gì là được phải không anh. Cảm ơn anh nhé.
Giúp em luôn câu lệnh thoát khỏi luôn các vòng lập với?
 
Upvote 0
Vâng cám ơn Bác, vậy muốn gán Ô để chứa công thức IF đó thì E phải làm như thế nào ạ..? Cụ thể trong bài của E, mỗi lần ghi 1 dòng mới thì ô cuối cùng tự động gán 1 công thức if vào..!
Có nhất thiết phải kèm theo hàm If trong vba không ? lý do:
-- Chữ giỏi sẽ bị lỗi font ( <--- bạn phải dùng thêm vài ký tự unicode để giải quyết việc này)
--- nếu viết code để gán công thức vào excel --> thì ta viết luôn công thức vào excel cho xong
Bạn thử cách này xem:
* Công thức cho F2 :
PHP:
=IF(AND(C2="",D2="",E2=""),"",(C2+D2+E2)/3)
* Công thức cho G2 tại sheet DL :
PHP:
=IF(F2="","",IF(F2>8,"Giỏi",IF(AND(F2<=8,F2>5),"TB","Kém")))
--> bạn kéo công thức này xuống hết !

* Khi đó code có thể dùng như sau :
PHP:
Sub ghiDL()    
  Sheets("Nhap").Range("C4:C8").Copy    
  Sheets("DL").Range("A65536").End(3).Offset(1).PasteSpecial Transpose:=True    
  Application.CutCopyMode = False
End Sub
 
Upvote 0
Trợ giúp Marco/VBA

Sheet 1 Mình có cột A và B có chứa dữ liệu
Bên cạnh đó mình có nút bấm marco.
Mình đã ghi marco cho nút bấm để copy dữ liệu cột A và B trong cùng 1 hàng vào ô A2 và B2
Nhưng như vậy mình phải tạo nhiều marco cho mỗi 1 nút bấm
Có cách nào mà mình chỉ cần tạo 1 sub mà khi bấm nút thì dữ liệu tự điền vào ô A2 và B2 không?
Mong mọi người trợ giúp, thanks
Mình gửi file đính kèm
( Bấm nút Brazil thì dữ liệu Brazil&tid=q vào ô A2 , Brazil&tid=c vào ô B2 , tương tự với các nút bấm khác cũng vậy )
 

File đính kèm

Upvote 0
Có nhất thiết phải kèm theo hàm If trong vba không ? lý do:
-- Chữ giỏi sẽ bị lỗi font ( <--- bạn phải dùng thêm vài ký tự unicode để giải quyết việc này)
--- nếu viết code để gán công thức vào excel --> thì ta viết luôn công thức vào excel cho xong
Bạn thử cách này xem:
* Công thức cho F2 :
PHP:
=IF(AND(C2="",D2="",E2=""),"",(C2+D2+E2)/3)
* Công thức cho G2 tại sheet DL :
PHP:
=IF(F2="","",IF(F2>8,"Giỏi",IF(AND(F2<=8,F2>5),"TB","Kém")))
--> bạn kéo công thức này xuống hết !

* Khi đó code có thể dùng như sau :
PHP:
Sub ghiDL()    
  Sheets("Nhap").Range("C4:C8").Copy    
  Sheets("DL").Range("A65536").End(3).Offset(1).PasteSpecial Transpose:=True    
  Application.CutCopyMode = False
End Sub

Oài làm như Bác chỉ thì E cũng đã biết rồi ạ..

Vấn đề của E là cần Bác giúp E gán lệnh IF vào mỗi lần ghi dữ liệu mới vào sheet "Dulieu" thôi ạ (lỗi font cũng không vấn đề gì) CÓ ĐƯỢC KHÔNG Ạ???
 
Lần chỉnh sửa cuối:
Upvote 0
Sheet 1 Mình có cột A và B có chứa dữ liệu
Bên cạnh đó mình có nút bấm marco.
Mình đã ghi marco cho nút bấm để copy dữ liệu cột A và B trong cùng 1 hàng vào ô A2 và B2
Nhưng như vậy mình phải tạo nhiều marco cho mỗi 1 nút bấm
Có cách nào mà mình chỉ cần tạo 1 sub mà khi bấm nút thì dữ liệu tự điền vào ô A2 và B2 không?
Mong mọi người trợ giúp, thanks
Mình gửi file đính kèm
( Bấm nút Brazil thì dữ liệu Brazil&tid=q vào ô A2 , Brazil&tid=c vào ô B2 , tương tự với các nút bấm khác cũng vậy )

Assign Macro toàn bộ các Button cho Sub Main dưới đây nhé:
Mã:
Sub Main()
  Dim shp As Shape, rFind As Range
  Dim strFind As String
  Set shp = Sheet1.Shapes(Application.Caller)
  strFind = shp.TextFrame.Characters.Text & "&tid=q"
  Set rFind = Sheet1.Range("A:A").Find("*" & strFind, , xlValues, xlWhole)
  If Not rFind Is Nothing Then Sheet1.Range("A2:B2").Value = rFind.Resize(, 2).Value
End Sub
 

File đính kèm

Upvote 0
Oài làm như Bác chỉ thì E cũng đã biết rồi ạ..

Vấn đề của E là cần Bác giúp E gán lệnh IF vào mỗi lần ghi dữ liệu mới vào sheet "Dulieu" thôi ạ (lỗi font cũng không vấn đề gì) CÓ ĐƯỢC KHÔNG Ạ???

Thử code sau xem như thế nào,
[GPECODE=vb]
Sub ghiDL()
Dim tmpArr
tmpArr = Sheets("Nhap").Range("C4:C8")
With Sheets("DL").Range("A65536").End(xlUp).Offset(1)
.Resize(, 5) = WorksheetFunction.Transpose(tmpArr)
.Offset(, 5).FormulaR1C1 = "=(RC[-3]+RC[-2]+RC[-1])/3"
.Offset(, 6).FormulaR1C1 = "=IF(RC[-1]>8,""Gi?i"",IF(AND(RC[-1]<=8,RC[-1]>5),""TB"",""Kém""))"
End With
End Sub
[/GPECODE]
 
Upvote 0
Anh chị giải thích giúp em code này với ạ em lên sheach trên web có code thấy hay và muốn học tập nhưng muốn áp dụng sang cái khác thì ko có biết làm ạ
Mã:
[COLOR=#008000]Sub ViewKhauHao()[/COLOR][COLOR=#008000]On Error GoTo Ketthuc[/COLOR]
[COLOR=#008000]If TSCD.FilterMode = True Then[/COLOR]
[COLOR=#008000]TSCD.ShowAllData[/COLOR]
[COLOR=#008000]Range("F3").EntireColumn.Hidden = False[/COLOR]
[COLOR=#008000]GoTo Ketthuc[/COLOR]
[COLOR=#008000]End If[/COLOR]
[COLOR=#008000]    Range("Khauhao").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _[/COLOR]
[COLOR=#008000]        Range("M2:M3"), Unique:=False[/COLOR]
[COLOR=#008000]Range("F3").EntireColumn.Hidden = True[/COLOR]
[COLOR=#008000]Ketthuc:[/COLOR]
[COLOR=#008000]End Sub[/COLOR]
Và em muốn ứng dùng cái code này vào file này thì làm như thế nào ạ
 

File đính kèm

Upvote 0
Anh chị giải thích giúp em code này với ạ em lên sheach trên web có code thấy hay và muốn học tập nhưng muốn áp dụng sang cái khác thì ko có biết làm ạ
Mã:
[COLOR=#008000]Sub ViewKhauHao()[/COLOR][COLOR=#008000]On Error GoTo Ketthuc[/COLOR]
[COLOR=#008000]If TSCD.FilterMode = True Then[/COLOR]
[COLOR=#008000]TSCD.ShowAllData[/COLOR]
[COLOR=#008000]Range("F3").EntireColumn.Hidden = False[/COLOR]
[COLOR=#008000]GoTo Ketthuc[/COLOR]
[COLOR=#008000]End If[/COLOR]
[COLOR=#008000]    Range("Khauhao").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _[/COLOR]
[COLOR=#008000]        Range("M2:M3"), Unique:=False[/COLOR]
[COLOR=#008000]Range("F3").EntireColumn.Hidden = True[/COLOR]
[COLOR=#008000]Ketthuc:[/COLOR]
[COLOR=#008000]End Sub[/COLOR]
Và em muốn ứng dùng cái code này vào file này thì làm như thế nào ạ
Cho mình hỏi với file bạn gửi lên, bạn muốn làm gì ? hay thể hiện điều gì ? <--- bạn cần nói cụ thể hơn !
 
Upvote 0
Anh chị giải thích giúp em code này với ạ em lên sheach trên web có code thấy hay và muốn học tập nhưng muốn áp dụng sang cái khác thì ko có biết làm ạ
Mã:
[COLOR=#008000]Sub ViewKhauHao()[/COLOR][COLOR=#008000]
On Error GoTo Ketthuc[/COLOR] ' Nếu gặp lỗi thì nhảy đến nhãn Ketthuc
[COLOR=#008000]If TSCD.FilterMode = True Then [/COLOR]' Nếu Sheet TSCD đang ở chế độ Filter thì (TSCD là CodeName)
[COLOR=#008000]TSCD.ShowAllData[/COLOR] ' Hiện hết dữ liệu (bỏ filter ở tất cả các cột)
[COLOR=#008000]Range("F3").EntireColumn.Hidden = False[/COLOR] ' Bỏ ẩn cột F
[COLOR=#008000]GoTo Ketthuc[/COLOR] ' Nhảy đến nhãn Ketthuc
[COLOR=#008000]End If[/COLOR]
[COLOR=#008000]    Range("Khauhao").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _[/COLOR]
[COLOR=#008000]        Range("M2:M3"), Unique:=False[/COLOR] ' Lọc nâng cao (Advance Filter) vùng Khauhao (Khauhao là 1 name của 1 vùng dữ liệu) với vùng điều kiện M2:M3 và lọc duy nhất
[COLOR=#008000]Range("F3").EntireColumn.Hidden = True[/COLOR] ' Ẩn cột F
[COLOR=#008000]Ketthuc:[/COLOR]' Nhãn Ketthuc
[COLOR=#008000]End Sub[/COLOR]
Và em muốn ứng dùng cái code này vào file này thì làm như thế nào ạ
Bạn phải nói bạn muốn làm gì thì mới ứng dụng được chứ. Bạn đưa mỗi cái file không nói gì hết thì ai biết đường nào mà ứng dụng.
 
Upvote 0
Bạn phải nói bạn muốn làm gì thì mới ứng dụng được chứ. Bạn đưa mỗi cái file không nói gì hết thì ai biết đường nào mà ứng dụng.
!$@!!, em nhờ Anh, Chị Giải thích em code trên, và ứng dụng code đó vào file của em, ở đây file của em ko cần ẩn cột, thế nên em chỉ lọc dữ liệu không trống.
----------------
Em loay hoay mà không làm đc nên lên nhờ anh chị
 
Lần chỉnh sửa cuối:
Upvote 0
!$@!!, em nhờ Anh, Chị Giải thích em code trên, và ứng dụng code đó vào file của em, ở đây file của em ko cần ẩn cột, thế nên em chỉ lọc dữ liệu không trống.
----------------
Em loay hoay mà không làm đc nên lên nhờ anh chị

Giải thích code chi cho lòng vòng. Bạn chỉ cần vắn tắt thế này:
- Với file dữ liệu của bạn, bạn muốn lọc thế nào?
- Lọc xong, đặt kết quả ở đâu?
Vậy thôi là đủ rồi. Code của người ta, dùng cho công việc của người ta thì liên quan gì đến file của bạn mà quan tâm
 
Upvote 0
Giải thích code chi cho lòng vòng. Bạn chỉ cần vắn tắt thế này:
- Với file dữ liệu của bạn, bạn muốn lọc thế nào?
- Lọc xong, đặt kết quả ở đâu?
Vậy thôi là đủ rồi. Code của người ta, dùng cho công việc của người ta thì liên quan gì đến file của bạn mà quan tâm
:) vâng em muốn lọc ngay trên dữ liệu gốc, dung bottom để lọc dạng như dùng autofilter ạ, khi đang ở chế độ lọc, thì khi kick vào bottom, sẽ bung lọc và ngược lại
 
Upvote 0
:) vâng em muốn lọc ngay trên dữ liệu gốc, dung bottom để lọc dạng như dùng autofilter ạ, khi đang ở chế độ lọc, thì khi kick vào bottom, sẽ bung lọc và ngược lại

Lọc là lọc cột nào, điều kiện như thế nào và đặt ở đâu.

Lòng vòng mấy bài mà bạn không nói rõ ý được.
 
Upvote 0
:) vâng em muốn lọc ngay trên dữ liệu gốc, dung bottom để lọc dạng như dùng autofilter ạ, khi đang ở chế độ lọc, thì khi kick vào bottom, sẽ bung lọc và ngược lại

Nếu chỉ đơn giản là ẩn và hiện autofilter thì là vậy:
PHP:
Sub GPE()
       Range("B5:E5").autofilter
End sub

Còn nếu bạn muốn lọc theo điều kiện nào ? lọc như thế nào ?........ thì bạn phải nói rõ nội dung, vùng điều kiện ,.......
 
Upvote 0
Lọc là lọc cột nào, điều kiện như thế nào và đặt ở đâu.

Lòng vòng mấy bài mà bạn không nói rõ ý được.
Vâng thực sự em chưa hiểu về vba nên giải thích có hơi khó hiểu mong anh chị thông cảm, lọc toàn bộ vùng dữ liệu của bảng, cột cần lọc là cột số tiền, nếu cột số tiền có dữ liệu ="" hoặc =0 thì sẽ không lọc, lọc tại dữ liệu gốc
 
Upvote 0
Nếu chỉ đơn giản là ẩn và hiện autofilter thì là vậy:
PHP:
Sub GPE()
       Range("B5:E5").autofilter
End sub

Còn nếu bạn muốn lọc theo điều kiện nào ? lọc như thế nào ?........ thì bạn phải nói rõ nội dung, vùng điều kiện ,.......
Em test cái code của anh nó ko ra ạ, ko biết sai sót chỗ nào ko, Vâng ý của em là như vậy
 
Upvote 0
Vâng thực sự em chưa hiểu về vba nên giải thích có hơi khó hiểu mong anh chị thông cảm, lọc toàn bộ vùng dữ liệu của bảng, cột cần lọc là cột số tiền, nếu cột số tiền có dữ liệu ="" hoặc =0 thì sẽ không lọc, lọc tại dữ liệu gốc

Làm đại vậy. Không biết đúng ý không.
 

File đính kèm

Upvote 0
Dạ đúng là như vậy ạ, Nếu em ko muốn dùng developer để vẽ và dùng insert trên thanh công cụ thì có được không
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh em giải thích dùm ý nghĩa 2 dòng code bên dưới với. chi tiết càng tốt để mình có thế hiểu và áp dụng rộng hơn!
Range("A2:A" & [A65000].End(xlUp).Row).Resize(, [A1].End(xlToRight).Column).Copy
Range("A65000").End(xlUp).Select
 
Upvote 0
Dạ đúng là như vậy ạ, Nếu em ko muốn dùng developer để vẽ và dùng insert trên thanh công cụ thì có được không

Bạn thích vẽ kiểu gì cứ vẽ, sau đó Assign Macro cho sub dưới đây là được:
Mã:
Public bChk As Boolean
Sub Main()
  Dim rng As Range
  On Error Resume Next
  Set rng = Sheet1.AutoFilter.Range
  If Not rng Is Nothing Then
    bChk = Not bChk
    If bChk Then rng.AutoFilter 3, ">0" Else rng.AutoFilter 3
  End If
End Sub
-------------
Ngoài lề: Mô tả vấn đề khó đến vậy sao? Vấn đề của bạn chỉ cần mô tả 1 câu là đủ: LỌC 1 CỘT VỚI ĐIỀU KIỆN KHÁC RỔNG
Thế thôi
 
Upvote 0
||||| hay thiệt đó, Thầy có thể giải thích đoạn code trên được không ạ, ví dụ như cái rng & bChk là cái gì vậy ạ,thực sự em ko hiểu về nó, nghĩ bảo học tuần tự nhưng time chưa cho phép, Thanks!
 
Upvote 0
||||| hay thiệt đó, Thầy có thể giải thích đoạn code trên được không ạ, ví dụ như cái rng & bChk là cái gì vậy ạ,thực sự em ko hiểu về nó, nghĩ bảo học tuần tự nhưng time chưa cho phép, Thanks!

Trước khi hỏi chắc bạn không nhìn kỹ:

Theo bạn, 2 cái dòng dưới đây là gì?

Public bChk As Boolean

Dim rng As Range
 
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE
 
Upvote 0
||||| hay thiệt đó, Thầy có thể giải thích đoạn code trên được không ạ, ví dụ như cái rng & bChk là cái gì vậy ạ,thực sự em ko hiểu về nó

Đầu tiên là biến bChk, tôi khai báo nó dang Boolean, có nghĩa là nó chỉ có 2 giá trị TRUE hoặc FALSE
Biến này dùng để "lật" đổi trạng thái: Cứ 1 lần Filter <> rổng thì đến 1 lần ShowAll. Nó "lật" được là nhờ dòng code bChk = Not bChk (bấm lần 1, bChk biến thành TRUE, bấm lần 2, bChk biến thành FALSE và cứ thế....)
----------------------
Tiếp theo là biến rng, tôi khai báo nó dạng Range, có nghĩa là rng chính là 1 vùng nào đó trên bảng tính
Ở đây tôi Set rng = Sheet1.AutoFilter.Range có nghĩa là trên Sheet1, chổ nào có chứa AutoFilter thì tôi set rng chính là chổ đó (mà không cần phải ghỉ rõ C5:E10 gì cả)
 
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE

Thì bạn cứ chọn sheet đó, rồi mở properties ra, sửa lại tại mục Name thôi, miễn đừng trùng tên là được.
 
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE
Trong cửa sổ VBA, ta chỉ có thể:
- Đổi Sheet CodeName tại mục (Name)
- Đổi SheetName tai mục Name


Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thích vẽ kiểu gì cứ vẽ, sau đó Assign Macro cho sub dưới đây là được:
Mã:
Public bChk As Boolean
Sub Main()
  Dim rng As Range
  On Error Resume Next
  Set rng = Sheet1.AutoFilter.Range
  If Not rng Is Nothing Then
    bChk = Not bChk
    If bChk Then rng.AutoFilter 3, ">0" Else rng.AutoFilter 3
  End If
End Sub
-------------
Ngoài lề: Mô tả vấn đề khó đến vậy sao? Vấn đề của bạn chỉ cần mô tả 1 câu là đủ: LỌC 1 CỘT VỚI ĐIỀU KIỆN KHÁC RỔNG
Thế thôi

Nếu chỉ điều kiện khác rỗng thôi thì như vầy sẽ ổn hơn:

Range("C5:E10").AutoFilter 3, "<>"

Nhưng vừa khác rỗng, vừa khác 0 thì như sau:

Range("C5:E10").AutoFilter 3, "<>", xlAnd, "<>0"

Bởi vì đó là cột số liệu, mà số liệu đôi khi nhỏ hơn 0, nếu ta đặt điều kiện >0 thì vô hình chung nó "kill" luôn những giá trị âm và 0.

Theo em nghĩ là vậy.
 
Upvote 0
Nhờ anh em giải thích dùm ý nghĩa 2 dòng code bên dưới với. chi tiết càng tốt để mình có thế hiểu và áp dụng rộng hơn!
Range("A2:A" & [A65000].End(xlUp).Row).Resize(, [A1].End(xlToRight).Column).Copy
Range("A65000").End(xlUp).Select

* bạn có thể hiểu Range là một đối tuợng dùng để tham chiếu 1 vùng dữ liệu trên bảng tính :
ví dụ : range("A1 :A3") là vùng dữ liệu từ ô A1:A3 (<---- nếu bạn biết về hàm indirect trong excel thì range cũng gần gần như thế)

* End(xlup),end(xltoright) giống hệt như khi bạn ấn phím end + phím mũi tên lên trên hoặc sang phải trên bàn phím

* Row,Column trả về vị trí hàng và cột của 1 ô trên bảng tính : vd Range("A3").row = 3
*Resize : mở rộng , kéo dãn vùng tham chiếu : vdu : range("A1").resize(,2) sẽ được vùng tham chiếu là A1:B1

Nắm được các thuộc tính trên thì bạn sẽ "mổ xẻ " được dòng code ngay :
ví dụ :
Range("A2:A" & [A65000].End(xlUp).Row) :
+
[A65000].End(xlUp).Row: tương đương vơi việc bạn chọn ô A65000 trên bảng tính , xong rồi ấn phím End + mũi tên lên trên---> kết quả sẽ trả về ô chứa dữ liệu cuối cùng trong cột A ( tính từ trên xuống) ,và thuộc tính .Row sẽ trả về số hàng của ô này trong bảng tính
ví dụ : cột A có dữ liệu từ ô A2 đến ô A100
*[A65000].End(xlUp).Row =100
*Range("A2:A" & [A65000].End(xlUp).Row) = Range("A2:A" &100) = Range("A2:A100") thế thôi, câu lênh này đơn giản chỉ là chọn đúng vùng chứa dữ liệu trong cột A thôi
==> các vấn đề còn lại bạn tự mổ xẻ tiếp nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào ACE GPE, xin cho hỏi, trong cửa sổ VBA, có cách nào thay đổi tên sheet ko ạh?
ví dụ tôi có một sheet5 bây giờ muốn đổi thành sheet6.

cám ơn ACE

Không hiểu ý bạn là muốn đổi codeName hay chỉ là name thôi : ví dụ Sheet1(sheet1) : vùng "đo đỏ " là codename, còn trong ngoặc là Name ( xem ảnh minh họa tại #63 -tác giả Ndu )
Còn code thì là vậy :
Mã:
Sub Macro1()
    Sheets("Sheet5").Name = "Sheet6"
    ThisWorkbook.VBProject.VBComponents.Item("sheet5").Name = "sheet6"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh em giải thích dùm ý nghĩa 2 dòng code bên dưới với. chi tiết càng tốt để mình có thế hiểu và áp dụng rộng hơn!
PHP:
1
Range("A2:A" & [A65000].End(xlUp).Row).Resize(, [A1].End(xlToRight).Column).Copy
Mã:
[B]2[/B] Range("A65000").End(xlUp).Select

(1)

Đầu tiên là cụm từ:
[A65000].End(xlUp).Row

Nhìn vô đây, ta biết tác giả đang viết code xài cho E2003 vì số dòng trang tính tối đa hơn 65000 cỡ vài chục dòng;
[A65000].End(xlUp) là fương thức tìm ô có chứa dữ liệu cuối cùng thuộc cột 'A'

(Nói thêm(NT): Nếu CSDL của bạn là chuẩn, ta nên dùng fương thức [A9].End(xlDown); Mà tại sao là [A9] bạn tự tìm hiểu nha!)

Vậy là toàn cụm từ trên giúp ta tìm ra được dòng cuối của cột 'A' có dữ liệu

Thứ đến là cụm Range("A2:A" & [A65000].End(xlUp).Row)

Cái này để xác định 1 vùng thuộc cột 'A' có chứa dử liệu

(NT: Nếu dữ liệu của bạn chỉ đến dòng 99, thì
ta tạm hiểu rằng Range("A2:A" & [A65000].End(xlUp).Row) là vùng từ A2:A99)

Kế tiếp là cụm từ [A1].End(xlToRight)

Đây là fương thức tìm ô cuối cùng của dòng 1 có dữ liệu


Vậy là toàn bộ câu lệnh sẽ để xác định vùng cần Copy, đó là vùng bắt đầu từ [A1]
Với số dòng là dòng cuối của cột 'A' có chứa dữ liệu
& với số cột là cột cuối của dòng 1 có dữ liệu;

(NT: Nếu CSDL của bạn là chuẩn, ta thay toàn bộ những fiền muộn vừa nghe bằng câu lệnh sau:

[B2].CurrentRegion.Copy

(2)

Đó là tác giả ra lệnh cho VBA chọn ô mà ta đã đề cập bên trên


Mong hữu ích ít nhiều cho bạn & NT: Bạn có thể tìm hiểu các fương thức này trên diễn đàn bằng thừ khóa tương ứng.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Trong cửa sổ VBA, ta chỉ có thể:
- Đổi Sheet CodeName tại mục (Name)
- Đổi SheetName tai mục Name
Thầy có thể hướng dẫn mở cái bảng để đổi tên được không ạ, cái này ảo quá, tìm mãi ko ra, hic trước có lần mở đc, khi mà mới mở cửa sổ lên thì nó hiện, nhưng sau khi đóng rồi ko biết lấy ra từ đâu thanks !$@!!
 
Upvote 0
Thầy có thể hướng dẫn mở cái bảng để đổi tên được không ạ, cái này ảo quá, tìm mãi ko ra, hic trước có lần mở đc, khi mà mới mở cửa sổ lên thì nó hiện, nhưng sau khi đóng rồi ko biết lấy ra từ đâu thanks !$@!!
Nhấn Alt + F11 để mở cửa sổ VBE. Nhấn tiếp F4 để mở cửa sổ Properties.
 
Upvote 0
Loay ha loay hoay em nghịch cái gì bây h nó không cho lưu bất cứ cái gì trong VBA, nhấn F4 cũng không ra cửa sổ đó, híc teo huyền tèo
untitled.JPG
Nhờ anh chị xem và sửa giúp em ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Loay ha loay hoay em nghịch cái gì bây h nó không cho lưu bất cứ cái gì trong VBA, nhấn F4 cũng không ra cửa sổ đó, híc teo huyền tèo
View attachment 107115
Nhờ anh chị xem và sửa giúp em ạ

Cái này là hộp thoại thông báo : nếu save dưới dạng xlsx thì sẽ mất hết code trong moude > Do đó bạn phải chọn no,và save as dưới định dạng khác, như là xlsm.
 
Upvote 0
File quản lý kho chạy quá chậm

Dear Các cao Thủ
Em vừa mầy mò làm dc 1 file quản lý kho để phục vụ công việc. Ban đầu "Em ấy" chạy rất luột là nhưng không hiểu sao khi copy dữ liệu với số lượng lớn( >1000 dòng). là "em nó" cứ quay tít ngủ không chịu chạy. hic hic
EM post file nên đây mong các cao thủ giúp EM xem có cách nào làm cho nó chạy luột hơn không ạh.
 

File đính kèm

Upvote 0
Cái này là hộp thoại thông báo : nếu save dưới dạng xlsx thì sẽ mất hết code trong moude > Do đó bạn phải chọn no,và save as dưới định dạng khác, như là xlsm.
Dạ nhưng tại sao nó lại mất code ạ, em ko biết lý do vì sao, hay là xlsx của em nó bị sao ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Dear Các cao Thủ
Em vừa mầy mò làm dc 1 file quản lý kho để phục vụ công việc. Ban đầu "Em ấy" chạy rất luột là nhưng không hiểu sao khi copy dữ liệu với số lượng lớn( >1000 dòng). là "em nó" cứ quay tít ngủ không chịu chạy. hic hic
EM post file nên đây mong các cao thủ giúp EM xem có cách nào làm cho nó chạy luột hơn không ạh.

Không biết khái niệm "chạy luột" cua bạn có nghĩa gì.

Tôi nghĩ bạn nên tách ra từng phần để nhờ giúp đỡ và khi khỏi cần phải mô tả rõ ràng dữ liệu đầu vào như thế nào, mục đích của bạn là gì... Không có nhiều người đủ kiên nhẫn và thời gian để dịch ngược từ code của bạn ra mục đích và từ mục đích đó viết lại code nhất là khi bạn đưa nguyên cả file mà không hề mô tả một tí gì. Ngoài ra, chắc gì code của bạn đã thực hiện đúng ý đồ của bạn.
 
Upvote 0
Dạ nhưng tại sao nó lại mất code ạ, em ko biết lý do vì sao, hay là xlsx của em nó bị sao ạ

Định dạng file xlsx không cho lưu macro (có lẽ là để phòng ngừa virus cho người sử dụng). Vì vậy, khi lưu file với định dạng xlsx thì toàn một Macro trên file đó (nếu có) sẽ bị xóa hết đó là chuyện bình thường chứ máy bạn không bị gì cả. Tuy nhiên khi lưu file xlsx mà có Macro thì Excel có hỏi bạn có muốn save mà xóa Macro hay không. Bạn nên tập thói quen đọc kỹ khi có thông báo lạ, đừng click Yes hay No theo quán tính.
 
Upvote 0
Định dạng file xlsx không cho lưu macro (có lẽ là để phòng ngừa virus cho người sử dụng). Vì vậy, khi lưu file với định dạng xlsx thì toàn một Macro trên file đó (nếu có) sẽ bị xóa hết đó là chuyện bình thường chứ máy bạn không bị gì cả. Tuy nhiên khi lưu file xlsx mà có Macro thì Excel có hỏi bạn có muốn save mà xóa Macro hay không. Bạn nên tập thói quen đọc kỹ khi có thông báo lạ, đừng click Yes hay No theo quán tính.
Dạ vâng nhưng trong trường hợp này thì tại sao xlsx lại không thể lưu được macro, và cách giải quyết nó để xlsx có thể lưu. Vấn đề của em là như vậy ạ
 
Upvote 0
Dạ vâng nhưng trong trường hợp này thì tại sao xlsx lại không thể lưu được macro, và cách giải quyết nó để xlsx có thể lưu. Vấn đề của em là như vậy ạ

File .xlsx không cho lưu Macro là do Excel quy định như vậy. Nếu muốn lưu Macro thì bạn hãy lưu file với định dạng .xls (dùng cho Excel 2003 trở lên) hoặc .xlsm (dùng cho Excel 2007 trở lên).
 
Upvote 0
File .xlsx không cho lưu Macro là do Excel quy định như vậy. Nếu muốn lưu Macro thì bạn hãy lưu file với định dạng .xls (dùng cho Excel 2003 trở lên) hoặc .xlsm (dùng cho Excel 2007 trở lên).
Thanks anh, từ trước giờ em cứ ngĩ mọi xlsx có thể lưu mcr, :)
 
Upvote 0
Không biết khái niệm "chạy luột" cua bạn có nghĩa gì.

Tôi nghĩ bạn nên tách ra từng phần để nhờ giúp đỡ và khi khỏi cần phải mô tả rõ ràng dữ liệu đầu vào như thế nào, mục đích của bạn là gì... Không có nhiều người đủ kiên nhẫn và thời gian để dịch ngược từ code của bạn ra mục đích và từ mục đích đó viết lại code nhất là khi bạn đưa nguyên cả file mà không hề mô tả một tí gì. Ngoài ra, chắc gì code của bạn đã thực hiện đúng ý đồ của bạn.

TKS bác đã nhắc nhở vây cho Em hỏi 1 trường hợp cụ thể sau: chắc bác nhìn vào Code là biết đây là code cập nhật dữ liệu.
vậy bác cho EM hỏi Đoạn code này có thể rút ngắn hơn không?hay thay thế bàng 1code khác mà vẫn có tác dụng như code cũ.
vi theo EM biết có nhiều cách để lưu dữ liệu sang sheet khá nhưng em chỉ biết mỗi cách này thôi

Sub Macro1()


' Macro1 Macro
'


'


Sheets("nhap xuat hang").Select
a = Range("k6").Value
b = Range("e5").Value
c = Range("e8").Value
d = Range("i8").Value
e = Range("e9").Value
no = Range("i6").Value
co = Range("i7").Value
f = Range("e10").Value
g = Range("i10").Value
h = Range("e53").Value
j = Range("k62").Value
k = Range("h62").Value
L = Range("e62").Value
m = Range("c62").Value
Range("d14:k48").Copy
Sheets("TH xuat nhap").Select
n = Range("A1").Value
Range("B1").Select
ActiveCell.Offset(n + 3, -1).Value = a
ActiveCell.Offset(n + 3, 0).Value = b
ActiveCell.Offset(n + 3, 1).Value = c
ActiveCell.Offset(n + 3, 2).Value = d
ActiveCell.Offset(n + 3, 3).Value = no
ActiveCell.Offset(n + 3, 4).Value = co
ActiveCell.Offset(n + 3, 5).Value = e
ActiveCell.Offset(n + 3, 6).Value = f
ActiveCell.Offset(n + 3, 7).Value = g
ActiveCell.Offset(n + 3, 8).Value = h
ActiveCell.Offset(n + 3, 17).Value = j
ActiveCell.Offset(n + 3, 18).Value = k
ActiveCell.Offset(n + 3, 19).Value = L
ActiveCell.Offset(n + 3, 20).Value = m
ActiveCell.Offset(n + 3, 9).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("TH xuat nhap").Select
Range("K4:K1219").Copy
Sheets("DMVT").Select
Range("B6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Range("$B$6:$B$1221").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveWorkbook.Worksheets("DMVT").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("DMVT").AutoFilter.Sort.SortFields.Add Key:=Range( _
"B4:B1214"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("DMVT").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Sheets("nhap xuat hang").Select
Application.CutCopyMode = False
Range("e5").Select
Selection.ClearContents
Range("d14:k48").Select
Selection.ClearContents
Range("i6:i7").Select
Selection.ClearContents
Range("e3").Select
End Sub
 
Upvote 0
TKS bác đã nhắc nhở vây cho Em hỏi 1 trường hợp cụ thể sau: chắc bác nhìn vào Code là biết đây là code cập nhật dữ liệu.
vậy bác cho EM hỏi Đoạn code này có thể rút ngắn hơn không?hay thay thế bàng 1code khác mà vẫn có tác dụng như code cũ.
vi theo EM biết có nhiều cách để lưu dữ liệu sang sheet khá nhưng em chỉ biết mỗi cách này thôi
Sub Macro1()
...........
Sheets("nhap xuat hang").Select
a = Range("k6").Value
......................
Bạn muốn làm gì thì đưa file lên và nói rõ yêu cầu, kết quả cần có, người khác viết code giúp bạn, có lẽ còn đỡ "chóng mặt" hơn là cố đọc và hiểu trong macro hàng trăm dòng của bạn muốn làm cái gì.
 
Upvote 0
Mình muốn Xin 2 vi dụ đầy đủ cấu trúc, đơn gian hay dùng nhưng dễ hiểu về 2 vấn đề sau:
1----Gán giá trị của các ô trong một vùng ( n dòng, m cột) vào một mảng 2 chiều A(1 to n, 1 to m)
2----Gán ngược lai câu hỏi trên
( mình cứ phải chạy vòng lập khi gán như trên, có cách nào ngắn ngọn chỉ cho mình với)
 
Upvote 0
Mình muốn Xin 2 vi dụ đầy đủ cấu trúc, đơn gian hay dùng nhưng dễ hiểu về 2 vấn đề sau:
1----Gán giá trị của các ô trong một vùng ( n dòng, m cột) vào một mảng 2 chiều A(1 to n, 1 to m)
2----Gán ngược lai câu hỏi trên
( mình cứ phải chạy vòng lập khi gán như trên, có cách nào ngắn ngọn chỉ cho mình với)

Không có gì dễ bằng:
1> Từ Range vào Array
Mã:
Sub Test
  Dim arr
  arr = Range("Gì gì đó").Value
End Sub
2> Từ Array vào Range
Mã:
Sub Test
  Dim arr
  ''Code gì gì đó để có arr
  Range("Gì gì đó").Resize(UBound(arr,1), UBound(arr, 2)).Value = arr
End Sub
 
Upvote 0
Không có gì dễ bằng:
1> Từ Range vào Array
Mã:
Sub Test
  Dim arr
  arr = Range("Gì gì đó").Value
End Sub
2> Từ Array vào Range
Mã:
Sub Test
  Dim arr
  ''Code gì gì đó để có arr
  Range("Gì gì đó").Resize(UBound(arr,1), UBound(arr, 2)).Value = arr
End Sub
Vậy em hiểu thế này có đúng không ạ: Em có mảng A(n,m) và vùng A có a dòng, b cột . Muốn chuyển đổi dữ liệu được thi phải thỏa mãn n= a và m= b phải không ạ. Và lúc đó không phải dùng

.Resize(UBound(arr,1), UBound(arr, 2))
đúng không ạ?
cứ viết là:
Range("-----").value=A
A= range("----").value
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy em hiểu thế này có đúng không ạ: Em có mảng A(n,m) và vùng A có a dòng, b cột . Muốn chuyển đổi dữ liệu được thi phải thỏa mãn n= a và m= b phải không ạ. Và lúc đó không phải dùng

.Resize(UBound(arr,1), UBound(arr, 2))
đúng không ạ?
cứ viết là:
Range("-----").value=A
A= range("----").value

Chính xác là vậy!
Bạn tiến bộ nhanh thật... Mới ngày nào thôi mà bây giờ viết code... ầm ầm
 
Upvote 0
Mình đang tìm hiểu về đoạn code khóa sheet " protect_sheet". Nghĩa là khi sheet được Protect thì sheet đó không thể sửa chữa được mà chỉ ở dạng sem và đọc thôi. Tất nhiên khi prorect_sheet người lập trình đã phải lựa chọn cài đặt lại một số chức năng như được autofilter, ẩn dòng ...để người dùng có thể thao tác được chứ không hẳn như mình nói ở trên là chỉ đọc mà không chỉnh sửa được.Đây là mình hiểu về Protect_sheet
Thế còn đoạn code sau
Mã:
Public Sub Protect_Sheets()
On Error Resume Next
Dim strPass As String
Dim sht_name As Worksheet
InputBox ("tao dang voc")
strPass = InputBox("Enter your Password")
For Each sht_name In Worksheets
    If Not sht_name.ProtectContents Then        ' [COLOR=#ff0000]MÌNH KHÔNG HIỂU TỪ ĐÂY[/COLOR]
        sht_name.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=strPass
    End If
Next sht_name
End Sub
mình không hiểu đoạn cuối. Anh em có thể diễn giải cho mình hiểu thêm với?
 
Upvote 0
Mình đang tìm hiểu về đoạn code khóa sheet " protect_sheet". Nghĩa là khi sheet được Protect thì sheet đó không thể sửa chữa được mà chỉ ở dạng sem và đọc thôi. Tất nhiên khi prorect_sheet người lập trình đã phải lựa chọn cài đặt lại một số chức năng như được autofilter, ẩn dòng ...để người dùng có thể thao tác được chứ không hẳn như mình nói ở trên là chỉ đọc mà không chỉnh sửa được.Đây là mình hiểu về Protect_sheet
Thế còn đoạn code sau
Mã:
Public Sub Protect_Sheets()
On Error Resume Next
Dim strPass As String
Dim sht_name As Worksheet
[COLOR=#ffd700][B]InputBox ("tao dang voc")[/B][/COLOR]
strPass = InputBox("Enter your Password")
For Each sht_name In Worksheets
    If Not sht_name.ProtectContents Then        ' [COLOR=#ff0000]MÌNH KHÔNG HIỂU TỪ ĐÂY[/COLOR]
        sht_name.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=strPass
    End If
Next sht_name
End Sub
mình không hiểu đoạn cuối. Anh em có thể diễn giải cho mình hiểu thêm với?

Tôi chả biết cái dòng tôi tô màu vàng để làm cái quái gì nữa!

Từ cái chỗ màu đỏ, bạn cứ ghi macro việc thao tác khóa sheet thì bạn sẽ biết cách mà nó thực hiện.

Riêng cái sht_name.ProtectContents là phương thức để xác định sheet đã khóa hay chưa, nó trả về giá trị Boolean (True/False).

Vòng lặp For Each ... Next trong trường hợp này là xét tất cả các sheet có trong WorkBook và đại diện cho mỗi sheet chính là sht_name.
 
Upvote 0
Tôi chả biết cái dòng tôi tô màu vàng để làm cái quái gì nữa!

Từ cái chỗ màu đỏ, bạn cứ ghi macro việc thao tác khóa sheet thì bạn sẽ biết cách mà nó thực hiện.

Riêng cái sht_name.ProtectContents là phương thức để xác định sheet đã khóa hay chưa, nó trả về giá trị Boolean (True/False).

Vòng lặp For Each ... Next trong trường hợp này là xét tất cả các sheet có trong WorkBook và đại diện cho mỗi sheet chính là sht_name.
Cái chỗ cậu bôi vàng là mình thử dòng code " inputbox" "Vừa học thêm được cái "inputbox" đấy. Thank bạn nhé
Mã:
DrawingObjects:=True, Contents:=True, Scenarios:=True
3 cái này lúc nào cũng phải có để protect sheet hả ban?
 
Lần chỉnh sửa cuối:
Upvote 0
Cái chỗ cậu bôi vàng là mình thử dòng code " inputbox" "Vừa học thêm được cái "inputbox" đấy. Thank bạn nhé
Mã:
DrawingObjects:=True, Contents:=True, Scenarios:=True
3 cái này lúc nào cũng phải có để protect sheet hả ban?

Muốn thí nghiệm thì cứ xóa bỏ nó đi xem thế nào (tức chỉ quan tâm đến Password thôi)
Mã:
sht_name.Protect strPass
 
Upvote 0
Mã:
DrawingObjects:=True, Contents:=True, Scenarios:=True
3 cái này lúc nào cũng phải có để protect sheet hả ban?

Khi bạn thủ công để khóa sheet, sẽ có chỗ cho bạn đặt password và có những checkbox để bạn chọn lựa khóa hoặc không khóa những chọn lựa đó. Thì những thứ trên ghi lại những thao tác mà bạn chọn lựa vào. Tôi đã nói bạn thử ghi macro thao tác của bạn, sẽ thấy tất cả những gì bạn chọn lựa trong đó.
 
Upvote 0
Vậy là qua bài này em hiểu thêm được phương thức kiểm tra sheet đã protect chưa và thủ tục đơn giản nhất để protect 1 sheet " không cần vòng lặp for each..." all sheet trong workbook " dùng vòng lặp for each...."
Em nói lên đây là chốt lại cái hiểu được của em chỗ nào không đúng chỉnh lại cho em chứ không phải em tự đắc đâu đó nhé
 
Upvote 0
Khi chạy code máy lại có hiện tượng treo

Chào AC, em tạo file dưới (file đính kèm - File này đã có lần em đã đề cập với anh rùi đó nhưng chưa xử lý triệt để) để cho nhân viên quản lý kho của em làm. Nhưng khi làm sắp xong rùi nó lại gặp lỗi! Mà lỗi này em rất hay gặp sau mỗi khi em tạo các file ở Office 2007. Cụ thể là lỗi sau:

Trong mục Danh mục khách hàng (cập nhật khách hàng mới), cứ khi em nhập mã mới vào thì nó toàn bị đơ không cho nhập tiếp được? Em tìm hoài mài không biết nó sung thế nào? Hay lỗi ra sao? Em mạnh dạn gửi cho AC xem dùm cho em xem là lỗi gì ah?
Em rất mong AC dành cho em chút ít thời gian xem dùm cho em nhé!
Kính chúc AC nhiều sức khỏe và hạnh phúc!
 

File đính kèm

Upvote 0
Chào AC, em tạo file dưới (file đính kèm - File này đã có lần em đã đề cập với anh rùi đó nhưng chưa xử lý triệt để) để cho nhân viên quản lý kho của em làm. Nhưng khi làm sắp xong rùi nó lại gặp lỗi! Mà lỗi này em rất hay gặp sau mỗi khi em tạo các file ở Office 2007. Cụ thể là lỗi sau:

Trong mục Danh mục khách hàng (cập nhật khách hàng mới), cứ khi em nhập mã mới vào thì nó toàn bị đơ không cho nhập tiếp được? Em tìm hoài mài không biết nó sung thế nào? Hay lỗi ra sao? Em mạnh dạn gửi cho AC xem dùm cho em xem là lỗi gì ah?
Em rất mong AC dành cho em chút ít thời gian xem dùm cho em nhé!
Kính chúc AC nhiều sức khỏe và hạnh phúc!

Nguyên nhân là do ComboBox tại các sheet PN, PX, THE KHO có ListFillRange liên kết với vùng dữ liệu tại Sheet List ---> Dẫn đến khi bạn nhập liệu ở sheet List thì các ListFillRange này thay đổi để cập nhật làm ảnh hướng quá trình nhập liệu
Không tin bạn có thể thử bằng cách vào 3 sheet ấy, lần lượt xóa hết các ListFillRange của ComboBox, xong nhảy đến Sheet List và nhập liệu sẽ thấy hết lỗi ngay
-------------------------------------------
Tóm lại: Đã viết code VBA thì không nên dùng ListFillRange cho ComboBox mà nên nạp ComboBox bằng List hoặc AddItem
(ListFillRange chỉ dành cho người không biết VBA mà thôi --=0)
Biết nguyên nhân rồi đấy, bạn tự sửa đi
 
Upvote 0
Nguyên nhân là do ComboBox tại các sheet PN, PX, THE KHO có ListFillRange liên kết với vùng dữ liệu tại Sheet List ---> Dẫn đến khi bạn nhập liệu ở sheet List thì các ListFillRange này thay đổi để cập nhật làm ảnh hướng quá trình nhập liệu
Không tin bạn có thể thử bằng cách vào 3 sheet ấy, lần lượt xóa hết các ListFillRange của ComboBox, xong nhảy đến Sheet List và nhập liệu sẽ thấy hết lỗi ngay
-------------------------------------------
Tóm lại: Đã viết code VBA thì không nên dùng ListFillRange cho ComboBox mà nên nạp ComboBox bằng List hoặc AddItem
(ListFillRange chỉ dành cho người không biết VBA mà thôi --=0)
Biết nguyên nhân rồi đấy, bạn tự sửa đi

Quả đúng là vậy. Ui, thích quá anh ah! Thanks a lot!
 
Upvote 0
Em có đoạn code này nhưng nhìn vào có nhiều chỗ chưa hiểu; rất mong được các anh chị giải thích giúp, (chỗ màu đỏ). Em cảm ơn rất nhiều.
Public Sub DiemSo()Dim sArr(), tArr(), dArr(), dArr2(), Dic As Object, I As Long, J As Long, K As Long, Ws As Worksheet, MaSV As String
Set Dic = CreateObject("Scripting.Dictionary")
MaSV = Sheets("So_quanLy").[G4].Value
With Sheets("Tong_hop")
sArr = Range(.[F7], .[F7].End(xlToRight)).Resize(2).Value
End With
ReDim dArr(1 To UBound(sArr, 2), 1 To 2)
For J = 1 To UBound(sArr, 2)
If Not Dic.Exists(sArr(2, J)) Then
Dic.Add sArr(2, J), J
dArr(J, 1) = sArr(2, J)
dArr(J, 2) = sArr(1, J)
End If
Next J '--------------------------------------------------------------
ReDim tArr(1 To 50, 1 To 13)
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name Like "M*" Then
sArr = Ws.Range(Ws.[B13], Ws.[B13].End(xlDown)).Resize(, 14).Value
For I = 1 To UBound(sArr, 1)
If sArr(I, 1) = MaSV Then
tArr(Dic.Item(Ws.Name), 1) = Dic.Item(Ws.Name)
tArr(Dic.Item(Ws.Name), 2) = dArr(Dic.Item(Ws.Name), 2)
For J = 3 To 13
tArr(Dic.Item(Ws.Name), J) = sArr(I, J + 1)
Next J
End If
Next I
End If
Next '--------------------------------------------------------------------
With Sheets("So_QuanLy")
sArr = .[A25:A40].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[B25:K40].Value = dArr2 'Nam 1----------------------------------
sArr = .[L25:L40].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[M25:V40].Value = dArr2 'Nam 2--------------------------
sArr = .[A49:A64].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[B49:K64].Value = dArr2 'Nam 3--------------------------'--------------------------
sArr = .[L49:L64].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[M49:V64].Value = dArr2 'Nam 4----------------------------------------------------
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Híc híc. Mong các Anh chị giải thích cho em vơi. Đầu óc bí !$@!! quá không sao hiểu. _)()(-
 
Upvote 0
Em có đoạn code này nhưng nhìn vào có nhiều chỗ chưa hiểu; rất mong được các anh chị giải thích giúp, (chỗ màu đỏ). Em cảm ơn rất nhiều.
công việc của bạn làm gì thì mình ko rõ nhưng mình nói ý mon na các dòng đỏ đỏ thế này :
[GPECODE=vb]
ReDim tArr(1 To 50, 1 To 13) ' thiết lập lại mãng Tarr gồm 50 dòng và 13 côt
For Each Ws In ThisWorkbook.Worksheets ' cho chạy qua từng worksheet
If Ws.Name Like "M*" Then ' nếu tên sheet có chữ M đứng trước thực hiện dòng dưới
sArr = Ws.Range(Ws.[B13], Ws.[B13].End(xlDown)).Resize(, 14).Value 'thiết lập lại mãng sArr
For I = 1 To UBound(sArr, 1) 'cho chạy vòng lập qua phần tử mãng (theo dòng )
If sArr(I, 1) = MaSV Then ' nếu phần tử mãng bằng với MaSV thì thực hiện lấy item trong dic gắp vào mãng tArr
tArr(Dic.Item(Ws.Name), 1) = Dic.Item(Ws.Name)
tArr(Dic.Item(Ws.Name), 2) = dArr(Dic.Item(Ws.Name), 2)
For J = 3 To 13 'cho chạy vòng lập (theo cot) và gắn giá trị cot tương ưng theo masv cho mãng tArr
tArr(Dic.Item(Ws.Name), J) = sArr(I, J + 1)[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Em đang tập viết code VBA. Nhưng nói chung còn quá gà, túm lại là còn chưa hiểu. Mong được mọi người giúp
Private Sub Thongke()
Dim dem As Long, Dic As Object, sArr, dArr(), J As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet("Tong_hop")
dem = [BL65000].End(xlUp).Row
For I = 1 To er
If Cells(I, 1) <> "" Then
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=0)*(Tong_hop!dem<4)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=4)*(Tong_hop!dem<5)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=5)*(Tong_hop!dem<6)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=6)*(Tong_hop!dem<7)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=7)*(Tong_hop!dem<8)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=8)*(Tong_hop!dem<9)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=9)*(Tong_hop!dem<10)]
End If
Next I
End With
End Sub
Chẳng biết kết hợp làm sao?. Làm mãi chẳng được. Muốn gán cho nó vào mảng và dùng vòng lặp để duyệt sau đó lấy kết quả mà chẳng thể làm nổi ..... Rất mong mọi người giúp cho. Thôi thì gửi file đính kèm nhờ mọi người giúp. Xin cảm ơn mọi người rất nhiều.
 

File đính kèm

Upvote 0
Em đang tập viết code VBA. Nhưng nói chung còn quá gà, túm lại là còn chưa hiểu. Mong được mọi người giúp
Private Sub Thongke()
Dim dem As Long, Dic As Object, sArr, dArr(), J As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet("Tong_hop")
dem = [BL65000].End(xlUp).Row
For I = 1 To er
If Cells(I, 1) <> "" Then
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=0)*(Tong_hop!dem<4)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=4)*(Tong_hop!dem<5)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=5)*(Tong_hop!dem<6)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=6)*(Tong_hop!dem<7)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=7)*(Tong_hop!dem<8)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=8)*(Tong_hop!dem<9)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=9)*(Tong_hop!dem<10)]
End If
Next I
End With
End Sub
Chẳng biết kết hợp làm sao?. Làm mãi chẳng được. Muốn gán cho nó vào mảng và dùng vòng lặp để duyệt sau đó lấy kết quả mà chẳng thể làm nổi ..... Rất mong mọi người giúp cho. Thôi thì gửi file đính kèm nhờ mọi người giúp. Xin cảm ơn mọi người rất nhiều.
-Bài này của bạn giải quyết rất là đơn giản: Nhưng để nút command đó chạy được thì bạn phải viết thủ tục trong modul và gán thủ tục đó cho command
-Hai bảng tonghop và hocky bạn nên lần lượt ở các cột BM và AB bạn dùng công thức excel " không muốn viết code cho chỗ này" tính bình thường sau đó bên bảng phụ tại cột B bạn đánh đúng các sếp loại như trung bình, trung bình khá ... gì đó tương đương với giá trị bên cột BM và AB sau đó mình hướng dẫn tiếp
 
Upvote 0

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

Back
Top Bottom