Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn thử liều mình với cái này cho vui

PHP:
Sub Copy()
   Dim Rng As Range
   
   Set Rng = Sheets("GPE").UsedRange
    Sheet1.UsedRange.Copy Destination:=Rng(2)
End Sub
 
Upvote 0
đã có 11 một lượt tải, chắc các anh chị thấy code vẫn chạy tốt phải không?

Em vẫn không sao tìm ra được nguyên nhân vì code không chạy (trên máy bạn em) sau khi đã chọn list tại validation (nghĩa là đã có sự kiện worksheet_change)

Code chỉ chạy khi, mình F2 (hoặc nháy đúp) rồi enter

Hic

Em nghĩ là do file nhưng không tìm ra nguyên nhân
Vì trên máy bạn em, em test sự kiện worksheet_change với file khác với chạy tốt

Riêng file test trên phải F2 & enter code mới chạy
Có ai biết nguyên nhân tại sao không?
 
Upvote 0
Theo ngu ý của tôi, thường copy, paste viết cho gọn makhồng bị rằng buộc nhiều điều kiện khac hay logic phải như thế nào, thì đơn giản viết

Mã:
    With Worksheets("sheet1").Range("a1") 
        .End(xlDown).Copy Destination:=Worksheets("sheet2").Range("C1") 
    End With
 
Upvote 0
Vẫn còn lơ mơ giữa mảng 1 chiều, mảng 2 chiều và Variant

Em thử Code này nhưng lỗi, xin hãy sửa lại dùm giúp em

PHP:
Sub Thunghiem()
Dim Arr, Tmp
Set Arr = Range("A1:B1000")
Tmp = Arr
i = UBound(Arr, 1)
MsgBox i
End Sub
 
Upvote 0
Em thử Code này nhưng lỗi, xin hãy sửa lại dùm giúp em

PHP:
Sub Thunghiem()
Dim Arr, Tmp
Set Arr = Range("A1:B1000")
Tmp = Arr
i = UBound(Arr, 1)
MsgBox i
End Sub
Bạn thử thế này nhé:
PHP:
Sub Thunghiem()
Dim Arr, Tmp
Arr = Range("A1:B1000").Value
Tmp = Arr
i = UBound(Arr, 1)
MsgBox i
End Sub
 
Upvote 0
Em thử Code này nhưng lỗi, xin hãy sửa lại dùm giúp em

PHP:
Sub Thunghiem()
Dim Arr, Tmp
Set Arr = Range("A1:B1000")
Tmp = Arr
i = UBound(Arr, 1)
MsgBox i
End Sub

Bạn đã Set Arr = Range("A1:B1000") ---> Chứng tỏ ArrRange (nếu bỏ từ Set đi thì Arr sẽ là Array)
Mà Range thì làm quái gì có UBound hay LBound
Thế nhưng khi bạn gán Tmp = Arr thì Tmp chắc chắn là Array
Nếu viết i = UBound(Tmp, 1) sẽ không có vấn đề
 
Upvote 0
Giúp em về sử dụng hàm Join

Em có 2 cột A và B có số phần tử như nhau, em muốn nối 2 cột A và B bằng hàm Join trong VBA thì phải viết thế nào?

Kết quả minh họa tại cột C màu đỏ theo file em đính kèm

(Mục đích của em là muốn học hàm Join trong VBA)
 

File đính kèm

  • Join.xls
    17.5 KB · Đọc: 9
Upvote 0
Em có 2 cột A và B có số phần tử như nhau, em muốn nối 2 cột A và B bằng hàm Join trong VBA thì phải viết thế nào?

Kết quả minh họa tại cột C màu đỏ theo file em đính kèm

(Mục đích của em là muốn học hàm Join trong VBA)
Hàm Join chỉ dùng được với mảng 1 chiều! Vậy nếu bạn có 1 mảng 2 chiều thì đầu tiên phải chuyển nó thành 1 chiều trước (bằng vòng lập), xong rồi cứ Join thôi
Riêng bài của bạn: Nói chuổi theo dòng (cùng dòng nối với nhau), vậy thì cứ dùng toán tử & mà nối, cần gì Join chứ
 
Upvote 0
Em vẫn đang ôn lại cái vụ mảng 1 chiều, mảng 2 chiều. Em viết như sau nhưng không được, mong mọi người chữa lại hộ
PHP:
Sub Thu()
Dim Arr(), MyRng As Range
Set MyRng = Sheet1.Range("A1:A10")
Arr = Application.WorksheetFunction.Transpose(MyRng)
MsgBox Arr(1, 4)
End Sub

----------------
Riêng bài của bạn: Nói chuổi theo dòng (cùng dòng nối với nhau), vậy thì cứ dùng toán tử & mà nối, cần gì Join chứ

Bài này dùng toán tử thì dễ rồi, nhưng vì chưa va chạm với hàm Join nên em thử xem cách dùng của nó ở ví dụ đơn giản xem thế nào thôi ah.
 
Upvote 0
Sau khi bạn dùng xong Transpose, Arr của bạn là mảng 1 chiều do vậy sửa lại đúng là
PHP:
Sub Thu()
Dim Arr(), MyRng As Range
Set MyRng = Sheet1.Range("A1:A10")
Arr = Application.WorksheetFunction.Transpose(MyRng)
MsgBox Arr(4)
End Sub

Bạn nên tìm tài liệu mà thày Ndu tặng diễn đàn tại địa chỉ http://www.giaiphapexcel.com/forum/showthread.php?50420-Code-xoá-Thư-mục/page2 , trong đó có rất nhiều ví dụ hay bạn tha hồ mà thực tập.
-------------------
Gửi bạn 1 ví dụ về Join của thày Ndu:
PHP:
Option Explicit
Function JoinText(ByVal SrcText, Optional Sep As String = vbLf) As String
  Dim Tmp, Arr
  On Error GoTo Stp1
  With WorksheetFunction
    Arr = .Transpose(SrcText)
    GoTo Stp2
Stp1:
    Arr = .Transpose(.Transpose(SrcText))
Stp2:
    Tmp = Join(Arr, vbTab)
    Tmp = Replace(Tmp, " ", vbBack)
    Tmp = Replace(Tmp, vbTab, " ")
    Tmp = .Trim(Tmp)
    Tmp = Replace(Tmp, " ", vbTab)
    Tmp = Replace(Tmp, vbBack, " ")
    Tmp = Replace(Tmp, vbTab, Sep)
  End With
  JoinText = Tmp
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
=

Bạn nên tìm tài liệu mà thày Ndu tặng diễn đàn tại địa chỉ http://www.giaiphapexcel.com/forum/showthread.php?50420-Code-xoá-Thư-mục/page2 , trong đó có rất nhiều ví dụ hay bạn tha hồ mà thực tập.
-------------------
Gửi bạn 1 ví dụ về Join của thày Ndu:
PHP:
Option Explicit
Function JoinText(ByVal SrcText, Optional Sep As String = vbLf) As String
  Dim Tmp, Arr
  On Error GoTo Stp1
  With WorksheetFunction
    Arr = .Transpose(SrcText)
    GoTo Stp2
Stp1:
    Arr = .Transpose(.Transpose(SrcText))
Stp2:
    Tmp = Join(Arr, vbTab)
    Tmp = Replace(Tmp, " ", vbBack)
    Tmp = Replace(Tmp, vbTab, " ")
    Tmp = .Trim(Tmp)
    Tmp = Replace(Tmp, " ", vbTab)
    Tmp = Replace(Tmp, vbBack, " ")
    Tmp = Replace(Tmp, vbTab, Sep)
  End With
  JoinText = Tmp
End Function
Code này viết từ hồi... xưa!
Hồi ấy viết thể tưởng là rất hay, giờ nhìn lại cũng thấy mắc cười
Ẹc... Ẹc...
 
Upvote 0
Tiện thể nhìn lại bài trước, thày cải tiến lại luôn giúp em thày nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Dấu hiệu nào để nhận biết cái nào là mảng 2 chiều, khi nào tạo ra mảng 1 chiều nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Dấu hiệu nào để nhận biết cái nào là mảng 2 chiều, khi nào tạo ra mảng 1 chiều nhỉ?
- Một mảng do chính bạn tự tạo ra, đương nhiên bạn phải biết mảng ấy là mấy chiều rồi, đúng không?
- Còn lại, mảng là sản phẩm của 1 code nào đó tạo ra, hoặc được gán từ 1 mảng khác thì buộc... phải nhớ
Ví dụ:
- Mảng được gán từ Range luôn là mảng 2 chiều (Base 1)
- Mảng lấy từ Dictionary (Dic.Keys, Dic.Items) luôn là mảng 1 chiều (Base 0)
- Tham số chính của ParamArray luôn là mảng 1 chiều (Base 0)
- Mảng được tạo thành từ hàm Split luôn là mảng 1 chiều (Base 0)
- Mảng được lấy từ List của ComboBox, ListBox luôn là mảng 2 chiều (Base 0)
vân vân....
 
Upvote 0
Dấu hiệu nào để nhận biết cái nào là mảng 2 chiều, khi nào tạo ra mảng 1 chiều nhỉ?

Thế bạn nhìn "cụm ô" A1:A10 thấy nó giống cái gì? Giống một mảng một chiều "dựng đứng" chứ gì. "Dựng đứng" là nói thế vì con người có khái niệm "trái phải, trên, dưới, đứng, ngang"
Còn "cụm ô" A1:C10 nó giống cái gì? Chắc chắn nó không gợi tới mảng một chiều.
Tôi chả hiểu Range nó là cái gì, nó có cấu trúc thế nào. Tôi dùng "trực giác", bạn có hiểu không?
Trực giác thì nhớ lâu.
Đấy là tôi nói về kết quả sau khi gán ... Transpose như trong code (đã xóa) của bạn
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
'Dim <ten bien> as <kieu_du_lieu>'
'Set <ten bien> = New <Kieu_du_lieu>'
Dim WsN As Worksheet
Dim WsD As Worksheet
Dim m, n, I, J As Long 'Long:gia tri kieu nguyen'
'm: dong cuoi cua NKC
'n: dong cuoi cua So cai'

Mã:
Sub LocForNext()
    Application.ScreenUpdating = False
    On Error GoTo Thoat
                               'WsN dai dien cho sheet NKC'
                               'WsD dai dien cho sheet So cai'
    Set WsN = Worksheets("NKC") 'phep' gan' doi tuong. voi tu khoa Set'
    Set WsD = Worksheets("SOCAI")
                                   'gan' Vung la khoang(A1:B3) nam trong sheet NKC '
    Set Vung = WsD.Range("A1:B3")  'range la khoang?'
                             'dongcuoi=Range("A1").End(xlDown).Row cho ke't qua? dongcuoi=102'
    m = WsN.Range("D65000").End(xlUp).Row 'WsN dai dien cho sheet NKC''LRow = ActiveSheet.Cells(65536, iCol).End(xlUp).Row'
    n = WsD.Range("D65000").End(xlUp).Row 'WsD dai dien cho sheet NKC'
    tk = WsD.Range("D5").Value 'tk = duoc gan'o^ D5 'So cai'  Value: gia' tri.'
    'Xoa du lieu cu cua sheet SOCAI 'so duoc lay du lieu'
    If n > 10 Then WsD.Range("A11:G" & n).Clear
    'Dung vong lap de gan du lieu
    [U]For I = 9 To m   ' lap 9 vong cua NKC'
        If WsN.Range("F" & I) = tk Then ' i la mot bien so ''F,B,E,G la cac' cot trong So? Cai'
            n = WsD.Range("D65000").End(xlUp).Row  'WsN dai dien cho sheet NKC'
            WsN.Range("B" & I & ":E" & I).Copy Destination:=WsD.Range("A" & n + 1)
            WsD.Range("E" & n + 1) = WsN.Range("G" & I)
            WsD.Range("F" & n + 1) = WsN.Range("H" & I)
        ElseIf WsN.Range("G" & I) = tk Then
            n = WsD.Range("D65000").End(xlUp).Row
            WsN.Range("B" & I & ":E" & I).Copy Destination:=WsD.Range("A" & n + 1)
            WsD.Range("E" & n + 1) = WsN.Range("F" & I)
            WsD.Range("G" & n + 1) = WsN.Range("H" & I)
        End If
    Next
    n = WsD.Range("D65000").End(xlUp).Row
    WsD.Range("A11:G" & n + 2).Font.Size = 8
    WsD.Range("F11:G" & n + 2).NumberFormat = "#,##0"
    WsD.Range("D" & n + 1) = WsD.Range("D1")
    WsD.Range("D" & n + 2) = WsD.Range("D2")
    WsD.Range("F" & n + 1 & ":G" & n + 1).Formula = "=SUM(R11C:R" & n & "C)"
    WsD.Range("F" & n + 1 & ":G" & n + 1).Value = WsD.Range("F" & n + 1 & ":G" & n + 1).Value
    Tong = WsD.Range("F10") - WsD.Range("G10") + WsD.Range("F" & n + 1) - WsD.Range("G" & n + 1)
    If Tong > 0 Then WsD.Range("F" & n + 2) = Tong Else WsD.Range("G" & n + 2) = Abs(Tong)
    If n > 10 Then Call LineDot(WsD.Range("A11:G" & n))
    Call LineThin(WsD.Range("A" & n + 1 & ":G" & n + 2))
    Exit Sub
    Application.ScreenUpdating = True
Thoat:
    Exit Sub
End Sub


Mã:
Private Function LineDot(Rng As Range)
    With Rng
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlDot
    End With
End Function

Mã:
Private Function LineThin(Rng As Range)
    With Rng
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
    End With
End Function[/U]
Các bạn giúp mình giải thích code từ đoạn (For I = 9 To m) mình đã đánh dấu gạch chân. Mình cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu là mình, mình sẽ làm như vầy:

PHP:
 Option Explicit
 Dim wNK As Worksheet, wSC As Worksheet
 Dim DCnk As Long, DCsc As Long, I As Long, J As Long
Sub LocForNext()
 Dim TK, Vung As Range, Tong As Double
 Application.ScreenUpdating = False
 On Error GoTo Thoat
 Set wNK = Worksheets("NKC"):       Set wSC = Worksheets("SOCAI")
 Set Vung = wSC.Range("A1:B3")
 DCnk = wNK.Range("D65000").End(xlUp).Row
 DCsc = wSC.Range("D65000").End(xlUp).Row
 TK = wSC.Range("D5").Value
'Xóa Du Lieu Cu Cua SOCAI:'
 If DCsc > 10 Then wSC.Range("A11:G" & DCsc).Clear
'Dùng Vòng Lap De Gán Du Lieu:'
1    For I = 9 To DCnk
        If wNK.Range("F" & I) = TK Then 'Duyet Các Cot Trong So Cái'
3            DCsc = wSC.Range("D65000").End(xlUp).Row
            wNK.Range("B" & I & ":E" & I).Copy Destination:=wSC.Range("A" & DCsc + 1)
5            wSC.Range("E" & DCsc + 1) = wNK.Range("G" & I)
            wSC.Range("F" & DCsc + 1) = wNK.Range("H" & I)
7        ElseIf wNK.Range("G" & I) = TK Then
            DCsc = wSC.Range("D65000").End(xlUp).Row
9            wNK.Range("B" & I & ":E" & I).Copy Destination:=wSC.Range("A" & DCsc + 1)
            wSC.Range("E" & DCsc + 1) = wNK.Range("F" & I)
11            wSC.Range("G" & DCsc + 1) = wNK.Range("H" & I)
        End If
13    Next I
    DCsc = wSC.Range("D65000").End(xlUp).Row
15    wSC.Range("A11:G" & DCsc + 2).Font.Size = 8
    wSC.Range("F11:G" & DCsc + 2).NumberFormat = "#,##0"
17    wSC.Range("D" & DCsc + 1) = wSC.Range("D1")
    wSC.Range("D" & DCsc + 2) = wSC.Range("D2")
19    wSC.Range("F" & DCsc + 1 & ":G" & DCsc + 1).Formula = "=SUM(R11C:R" & DCsc & "C)"
    wSC.Range("F" & DCsc + 1 & ":G" & DCsc + 1).Value = _
        wSC.Range("F" & DCsc + 1 & ":G" & DCsc + 1).Value
21    Tong = wSC.Range("F10") - wSC.Range("G10") + wSC.Range("F" & DCsc + 1) - wSC.Range("G" & DCsc + 1)
    If Tong > 0 Then
23        wSC.Range("F" & DCsc + 2) = Tong
    Else
25        wSC.Range("G" & DCsc + 2) = Abs(Tong)
    End If
27    If DCsc > 10 Then Call LineDot(wSC.Range("A11:G" & DCsc))
    Call LineThin(wSC.Range("A" & DCsc + 1 & ":G" & DCsc + 2))
29    Exit Sub
    Application.ScreenUpdating = True
Thoat:
31    Exit Sub
End Sub

(*) Bạn thấy mình khai báo các biến wNK & wSC có gợi nhớ hơn không?
(*) Để giải thích cho dòng lệnh dưới, ta nên có dấu ':' ở cuối dòng
(**) Trong macro của bạn, biến n được bạn giải thích là số dòng đếm được ;

Nhưng như vậy dòng lệnh mang số 2 (giữa 1 & 3) có vấn đề rồi; Bạn nên nói rõ í đồ của mình chỗ này; Lúc đó chúng ta mới tiếp được;

(***) Bạn không nên gọi 2 hàm, theo mình nên gọi 2 Sub & truyền cho chúng tham số thích hợp;

Cũng theo mình, 2 Sub này chỉ nên viết làm 1 với thêm 1 tham biến nữa mà thôi; Tuy nhiên cái này hạ hồi phân giải.

Chờ tin từ bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đang tìm hiểu về mảng, tôi tạo Code như thế này nhưng không chạy được, vậy nó sai ở đâu?

PHP:
Sub Loc()
    Dim sArr(), Arr(), i As Long, j As Long
    j = 1
    For i = 1 To 4
        sArr = Sheet1.Range("A" & i & ":C" & i).Value
        Arr = Sheet1.Range("F" & j & ":H" & j).Value
        Arr = sArr
        j = j + 1
    Next
    Sheet1.[F2].Resize(j).Value = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chưa hiểu yêu cầu bạn định làm với code trên như thế nào? CODE của bạn không phải k chạy mà là chạy chưa đúng yêu cầu bạn muốn làm??? Phải chẳng bạn muốn xoay Arr 90 độ khi gán xuống sheet??? Bạn có thể thay câu lệnh này :
Sheet1.[F2].Resize(j).Value = Arr
bằng câu này xem sao :
Sheet1.[F2].Resize(j).Value = Application.WorksheetFunction.Transpose(Arr)
Thanks!
 
Upvote 0
Tôi đang tìm hiểu về mảng, tôi tạo Code như thế này nhưng không chạy được, vậy nó sai ở đâu?

PHP:
Sub Loc()
    Dim sArr(), Arr(), i As Long, j As Long
    j = 1
    For i = 1 To 4
        sArr = Sheet1.Range("A" & i & ":C" & i).Value
        Arr = Sheet1.Range("F" & j & ":H" & j).Value
        Arr = sArr
        j = j + 1
    Next
    Sheet1.[F2].Resize(j).Value = Arr
End Sub

Không hiểu bạn tính làm gì, sao bạn gán chi nhiều vậy, theo cách bạn gán chắc viết gọn lại là
PHP:
Sub Loc()
    Dim sArr(), Arr(), i As Long, j As Long
    j = 5
    Arr = Sheet1.Range("A4:C4").Value
    Sheet1.[J2].Resize(j).Value = WorksheetFunction.Transpose(Arr)
End Sub
Mà vẫn chưa hiểu bạn muốn làm gì?
 
Lần chỉnh sửa cuối:
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