Chuyên mục xử lý, gỡ rối code VBA (3 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,957
.[C65536].End(xlUp) tương đương với ô mà khi chọn ô C65536 rồi nhấn Ctrl và phím mũi tên lên.

Select là phương thức (chọn), không trả về giá trị nên bị lỗi khi gán cho biến sArr.
vậy là khi thực hiện dòng lệnh này sẽ trả về giá trị, cụ thể là giá trị bao nhiêu vậy anh?

Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value


.[C6] thì chọn dòng đầu tiên của cột C ---------> đúng không?
.[C65536].End(xlUp) thì chọn dòng cuối cùng chứa dữ liệu của cột C ------->đúng không?
 
Upvote 0
vậy là khi thực hiện dòng lệnh này sẽ trả về giá trị, cụ thể là giá trị bao nhiêu vậy anh?

Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value


.[C6] thì chọn dòng đầu tiên của cột C ---------> đúng không?
.[C65536].End(xlUp) thì chọn dòng cuối cùng chứa dữ liệu của cột C ------->đúng không?
Bạn đang tra khảo tôi đấy à?
 
Upvote 0
Em thực sự không biết mà anh. Ví dụ như File này thì
Mã:
sArr = .Range(.[C6], .[C65536].End(xlUp)).Resize(, 4).Value
sẽ trả về giá trị bao nhiêu, anh chỉ em với
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 đã :p
 
Upvote 0
Mình đọc rồi mà chưa hiểu, Pacific nói dùm chỗ này đi.
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
 
Upvote 0
Chào mấy anh/chị

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
Help giúp em với ạ.
 
Upvote 0
Chào mấy anh/chị

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
dùng thử code
Mã:
Sub Locngayxuat()
    ActiveSheet.Range("$C$8:$Q$1001").AutoFilter Field:=2, Criteria1:=">=" & Range("I6").Value, Operator:=xlAnd, Criteria2:="<=" & Range("K6").Value
End Sub
 
Upvote 0
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
 
Upvote 0
Bạn viết hết fép cộng (có cả địa chỉ) ra xem sao?
Ví dụ:
Sheet2.[O8].Value + 1 + Sheets("CD-L1").[O8].Value + . . . .
 
Upvote 0
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
--------------------------------------
Bạn thử với cái này xem sao:
PHP:
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
 
Upvote 0
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.

mong mọi người giúp đỡ.
 
Upvote 0
Bạn thử với cái này xem sao:
PHP:
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
 
Upvote 0
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.
Đại loại nó như vầy:
Khai báo 1 cái Nmax as long
- Nmax = ...
For I = 2 to Nmax
...........
ShName = "CD-L" & i
...........
.Range("O8") = Sheets("CD-L1").Range("O8") +i-1
...........
Next I​
 
Upvote 0
Đại loại nó như vầy:
Khai báo 1 cái Nmax as long
- Nmax = ...
For I = 2 to Nmax
...........
ShName = "CD-L" & i
...........
.Range("O8") = Sheets("CD-L1").Range("O8") +i-1
...........
Next I​
Nmax gán phần tử con như nào anh nhỉ, em ko gán vào Nmax nó chạy end sub luôn!
 
Upvote 0
Nmax gán phần tử con như nào anh nhỉ, em ko gán vào Nmax nó chạy end sub luôn!
Nmax là số lớp đất lớn nhất của bạn.
Ví dụ Sheets(" PhanlopK95") là Sheet chứa dữ liệu phân lớp và Cột A ( Từ A3 đến A1000 chẳng hạn ) chứa số lớp thì
Nmax=Application.Max(Sheets("PhanlopK95").range("A3:A1000"))​
Hoặc
With Sheets("PhanlopK95")
Nmax=Application.Max(.range("A3:A")&.range("A65535").End(3).Row)​
End With​
 
Upvote 0
Nmax là số lớp đất lớn nhất của bạn.
Ví dụ Sheets(" PhanlopK95") là Sheet chứa dữ liệu phân lớp và Cột A ( Từ A3 đến A1000 chẳng hạn ) chứa số lớp thì
Nmax=Application.Max(Sheets("PhanlopK95").range("A3:A1000"))​
Hoặc
With Sheets("PhanlopK95")
Nmax=Application.Max(.range("A3:A")&.range("A65535").End(3).Row)​
End With​
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
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom