Topic Những câu hỏi về code, xin giải thích các code... đã quá dài nên mình đóng nó lại và mở topic khác
Tất cả những bài viết liên quan đến việc nhờ giải thích, xử lý và gỡ rối code VBA, các bạn vui lòng đăng tại đây!
Cảm ơn
Bác cứ học từ từ thôi. Không nóng vội được đâu. Bây giờ Bác sang Topic Các câu hỏi về mảng đọc rồi Bác sẽ hiểu
Nếu mới đầu thì qua Topic này học căn bản trước đã
Bác cứ học từ từ thôi. Không nóng vội được đâu. Bây giờ Bác sang Topic Các câu hỏi về mảng đọc rồi Bác sẽ hiểu
Nếu mới đầu thì qua Topic này học căn bản trước đã
Ngay bài 8 Topic các câu hỏi về mảng Thầy NDu đã nói như thế này rồi
Mã:
Ban chỉ cần nhớ điều này:
- Range và mảng không giống nhau
- 1 Range sau khi biến đổi thành mảng thì đó luôn là mảng 2 chiều
- Muốn biến thành mảng 1 chiều phải thêm các công đoạn khác, chẳng hạn dùng For... Next hoặc hàm TRANSPOSE
Do vậy sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value Thì sArr là mảng
Còn .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).select là range nếu muốn nó hoạt động được phải làm như bài 972 mà anh befaint đã hướng dẫn
Mã:
Sub test()
Dim sArr
Set sArr = Range([C6], [C65536].End(xlUp)).Resize(, 4)
sArr.Select
End Sub
Cho em hỏi, em muốn lọc autofilter ngày tháng như bên dưới, nhưng khi viết thì lúc lọc nó không ra đúng. Anh, Chị nào biết giúp em đoạn code bên dưới với.
Em cảm ơn.
Sub Locngayxuat()
Dim dDate As Date
Dim lDate As Long
If IsDate(Range("$C$8:$Q$1001")) Then
dDate = Range("$C$8:$Q$1001")
lDate = DateSerial(Year(dDate), Month(dDate), Day(dDate))
End If
Range("I6").Select
NgayBD = ActiveCell.Value
Range("K6").Select
NgayKT = ActiveCell.Value
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=NgayBD" & lDate, Operator:=xlAnd, Criteria2:="<=NgayKT" & lDate
End Sub
Cho em hỏi mình có code nào để rút ngắn lệnh trên excel không ạ.
Ví dụ như hình bên dưới, em muốn nhấn 1 lệnh là nó ra beetween luôn khỏi phải đi từng bước. View attachment 183514
Cho em hỏi, em muốn lọc autofilter ngày tháng như bên dưới, nhưng khi viết thì lúc lọc nó không ra đúng. Anh, Chị nào biết giúp em đoạn code bên dưới với.
Em cảm ơn.
Sub Locngayxuat()
Dim dDate As Date
Dim lDate As Long
If IsDate(Range("$C$8:$Q$1001")) Then
dDate = Range("$C$8:$Q$1001")
lDate = DateSerial(Year(dDate), Month(dDate), Day(dDate))
End If
Range("I6").Select
NgayBD = ActiveCell.Value
Range("K6").Select
NgayKT = ActiveCell.Value
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=NgayBD" & lDate, Operator:=xlAnd, Criteria2:="<=NgayKT" & lDate
End Sub
Sub Locngayxuat()
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=" & Range("I6").Value, Operator:=xlAnd, Criteria2:="<=" & Range("K6").Value
End Sub
Sub Locngayxuat()
ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=" & Range("I6").Value, Operator:=xlAnd, Criteria2:="<=" & Range("K6").Value
End Sub
Thưa thầy cho em hỏi về vòng for:
e có 5 sheet tên lần lượt là CD-L1 -:- CD-L5, giờ em lần lượt đánh công thức cộng từ ô O8 sheet2 + 1 với ô O8 của sheet CD-L1; sheet tiếp theo công 1 từ sheet CD-L1 >>> i = 5. code của em sai ko chạy được mong thầy giải thích hướng dẫn em
--------------------------------------
Sub DanhsoSheets()
Dim i As Long
For i = 1 To 5
Sheets("CD-L & i").Select
Range("O8") = "='CD-L1'!O8+i"
Next i
End Sub
Thưa thầy cho em hỏi về vòng for:
e có 5 sheet tên lần lượt là CD-L1 -:- CD-L5, giờ em lần lượt đánh công thức cộng từ ô O8 sheet2 + 1 với ô O8 của sheet CD-L1; sheet tiếp theo công 1 từ sheet CD-L1 >>> i = 5. code của em sai ko chạy được mong thầy giải thích hướng dẫn em
--------------------------------------
Sub DanhsoSheets()
Dim i As Long, ShName As String
On Error Resume Next
For i = 1 To 5
ShName = "CD-L" & i
With Sheets(ShName)
.Select
.Range("O8") = Sheets("CD-L1").Range("O8") + 1
End With
Next i
End Sub
Với đoạn Code trên thì mỗi lần chạy thì nó lại lấy ô O8 của Sheets("CD-L1") công thêm 1 đơn vị. Khi mình bấm 2 lần thì O8 của Sheets("CD-L1") bằng 2 và các Sheet tiếp theo làn lượt là 3,4 ... do vậy dẫn đến tên O8 và tên Sheet khác nhau do Code chạy từ 2 lần trở lên
Nếu tên Ô và tên Sheet giống nhau " Sheets("CD-L1"); O8 =1 .: ............" công thêm 1 ) thì bạn thử cái này thử
HTML:
Sub DanhsoSheets1()
Dim i As Long, ShName As String, Str As String
On Error Resume Next
Str = "CD-L"
For Each Sh In Worksheets
If Sh.Name Like Str & "*" Then
With Sh
.Select
.Range("O8") = Replace(Sh.Name, Str, "", 1)
End With
End If
Next Sh
End Sub
Public Sub GPE()
Dim Arr(), i As Integer, vArr()
Arr = Range("b2:m" & Range("m65000").End(xlUp).Row).Value
ReDim vArr(1 To UBound(Arr), 1 To 1)
For i = 1 To UBound(Arr)
vArr(i, 1) = Application.Evaluate(Arr(i, 1) & "/" & Arr(i, 12) & "*" & Arr(i, 2)) 'chia 8: 8 day so co dinh trong code luôn'
Next i
Range("d2").Resize(UBound(Arr)) = vArr
End Sub
chao e muốn thêm code này vArr(i, 1) = Application.Evaluate(Arr(i, 1) & "/" & Arr(i, 12) & "*" & Arr(i, 2))/8 số 8 tô màu đó là cố định trong code luôn.
câu @: e mun xai code hàm if cho e xin code hàm if với.
Sub DanhsoSheets()
Dim i As Long, ShName As String
On Error Resume Next
For i = 1 To 5
ShName = "CD-L" & i
With Sheets(ShName)
.Select
.Range("O8") = Sheets("CD-L1").Range("O8") + 1
End With
Next i
End Sub
Với đoạn Code trên thì mỗi lần chạy thì nó lại lấy ô O8 của Sheets("CD-L1") công thêm 1 đơn vị. Khi mình bấm 2 lần thì O8 của Sheets("CD-L1") bằng 2 và các Sheet tiếp theo làn lượt là 3,4 ... do vậy dẫn đến tên O8 và tên Sheet khác nhau do Code chạy từ 2 lần trở lên
Nếu tên Ô và tên Sheet giống nhau " Sheets("CD-L1"); O8 =1 .: ............" công thêm 1 ) thì bạn thử cái này thử
HTML:
Sub DanhsoSheets1()
Dim i As Long, ShName As String, Str As String
On Error Resume Next
Str = "CD-L"
For Each Sh In Worksheets
If Sh.Name Like Str & "*" Then
With Sh
.Select
.Range("O8") = Replace(Sh.Name, Str, "", 1)
End With
End If
Next Sh
End Sub
Với Sub này e sửa thành từ sheets thứ 2 trở đi bắt đầu cộng số. Nếu cho For chạy từ i đến max nghĩa có có thể 10 sheets hoặc nhiều hơn thì sửa như nào ạ. DanhsoSheets1 nhiều biến hay hàm em chưa hiểu lắm vì em đang tập tọe từng bước.
Sub DanhsoSheets()
Dim i As Long
Dim ShName As String
For i = 1 To 5
ShName = "CD-L" & i + 1
With Sheets(ShName)
.Select
.Range("O8") = Sheets("CD-L1").Range("O8") + i
End With
Next i
End Sub
Với Sub này e sửa thành từ sheets thứ 2 trở đi bắt đầu cộng số. Nếu cho For chạy từ i đến max nghĩa có có thể 10 sheets hoặc nhiều hơn thì sửa như nào ạ. DanhsoSheets1 nhiều biến hay hàm em chưa hiểu lắm vì em đang tập tọe từng bước.
Với vùng range trong bảng tính thì cấu trúc em hiểu rồi Nhưng đối với số sheets thì e nghĩ mãi chưa ra. a đưa ví dụ luôn với code trên DanhSoSheet () dùm em ạ
Em vừa chỉnh code chạy được rồi nhưng em nhìn nó chưa được như ý, em cảm thấy hơi cổ:
Sub DanhsoSheets3()
Dim i As Long, Nmax As Long
Dim ShName As String
On Error GoTo Thoat
For i = 2 To 1986
ShName = "CD-L" & i
With Sheets(ShName)
.Select
.Range("O8") = Sheets("CD-L1").Range("O8") + i - 1
End With
Next i
Thoat: MsgBox ("Thành Công")
End Sub