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:
Thực chất tôi thử lệnh cú pháp của mảng: Copy đoạn A1:C4 xuống đoạn F1:H4 ấy mà. Nói cách khác [A1:C4]=[F1:H4]
 
Upvote 0
Thực chất tôi thử lệnh cú pháp của mảng: Copy đoạn A1:C4 xuống đoạn F1:H4 ấy mà. Nói cách khác [A1:C4]=[F1:H4]
Trời, chỉ copy thôi mà FOR dữ vậy, bạn chỉ cần thế này thôi :
PHP:
Sub Loc()
With Sheet1
    .[A1:C4].Copy .[F1:H4]
End With
End Sub
Nếu tư duy để làm như bạn thì nó chạy đến i = 4 và nó gán luôn
[A4:C4] = [F4:H4] và và sArr lúc đó sẽ chỉ là [A4:C4].value (nếu
viết tường tận ra) vòng lặp dừng ở đây sau đó đổ ra sheet sao mà lấy được từ i =1 nữa trời.
 
Upvote 0
Trời, chỉ copy thôi mà FOR dữ vậy, bạn chỉ cần thế này thôi :
PHP:
Sub Loc()
With Sheet1
    .[A1:C4].Copy .[F1:H4]
End With
End Sub
Nếu tư duy để làm như bạn thì nó chạy đến i = 4 và nó gán luôn
[A4:C4] = [F4:H4] và và sArr lúc đó sẽ chỉ là [A4:C4].value (nếu
viết tường tận ra) vòng lặp dừng ở đây sau đó đổ ra sheet sao mà lấy được từ i =1 nữa trời.
Code theo phương pháp xử lý mảng nó phải như vầy:
PHP:
Sub Loc()
  With Sheet1
    .Range("F1:H4").Value = .Range("A1:C4").Value
  End With
End Sub
Hoặc kỹ 1 chút:
PHP:
Sub Loc()
  Dim sArray
  sArray = Sheet1.Range("A1:C4").Value
  Sheet1.Range("F1:H4").Value = Arr
End Sub
 
Upvote 0
Sao tôi viết Code Copy cả 2 dạng đều không được nhỉ

PHP:
Sub Macro1()
    Range("C3").Copy
    Range("A7").Paste
End Sub

PHP:
Sub Copy()
Range("C3").Copy Destination:=Range("A7")
End Sub
 
Upvote 0
Sao tôi viết Code Copy cả 2 dạng đều không được nhỉ

PHP:
Sub Macro1()
    Range("C3").Copy
    Range("A7").Paste
End Sub

PHP:
Sub Copy()
Range("C3").Copy Destination:=Range("A7")
End Sub
Cách 1 sửa như sau:
PHP:
Sub Macro1()
    Range("C3").Copy Range("A7")
End Sub
Cách 2 chạy bình thường
 
Upvote 0
Nếu cách 1 viết gọn thế thì cần gì phải thêm cái thằng Destination cho dài dòng nhỉ?
 
Upvote 0
Nếu cách 1 viết gọn thế thì cần gì phải thêm cái thằng Destination cho dài dòng nhỉ?
Đó cũng là cách viết gọn thôi cũng như 2 cách viết dưới đây như nhâu vậy:
Mã:
        Set Rng = Sh.Cells.Find(n.name, Sh.[A1], xlFormulas, 2)
        Set Rng = Sh.Cells.Find(what:=n.name, after:=Sh.[A1], LookIn:=xlFormulas, Lookat:=2)
 
Upvote 0
Em chưa hiểu Code sau nhầm ở điểm gì mà không chạy được, rất mong mọi người chỉ giúp

PHP:
Sub Ktra()
    Dim sArr, DL()
    With Sheet1.Range("A1").CurrentRegion.Offset(1, 1)
        sArr = .Resize(.Rows.Count - 1, .Columns.Count - 1)
        DL = sArr.Value
    End With
    MsgBox UBound(DL, 1)
End Sub
 
Upvote 0
Em chưa hiểu Code sau nhầm ở điểm gì mà không chạy được, rất mong mọi người chỉ giúp

PHP:
Sub Ktra()
    Dim sArr, DL()
    With Sheet1.Range("A1").CurrentRegion.Offset(1, 1)
        sArr = .Resize(.Rows.Count - 1, .Columns.Count - 1)
        DL = sArr.Value
    End With
    MsgBox UBound(DL, 1)
End Sub
Bạn ghi sArr = .Resize(.Rows.Count - 1, .Columns.Count - 1) thì sArr sẽ là 1 mảng ---> Vậy thì câu DL = sArr.Value là sai (mảng không có thuộc tính Value)
Nếu sửa thành:
Mã:
Sub Ktra()
  Dim sArr, DL()
  With Sheet1.Range("A1").CurrentRegion.Offset(1, 1)
    [COLOR=#ff0000][B]Set[/B][/COLOR] sArr = .Resize(.Rows.Count - 1, .Columns.Count - 1)
    DL = sArr.Value
  End With
  MsgBox UBound(DL, 1)
End Sub
hoặc vầy:
Mã:
Sub Ktra()
  Dim sArr, DL()
  With Sheet1.Range("A1").CurrentRegion.Offset(1, 1)
    [B][COLOR=#ff0000]sArr = .Resize(.Rows.Count - 1, .Columns.Count - 1)
    DL = sArr[/COLOR][/B]
  End With
  MsgBox UBound(DL, 1)
End Sub
Sẽ không có vấn đề
 
Upvote 0
Nhờ các bạn sửa dùm Code

Tôi loay hoay quá, ngồi sửa mãi mà nó cứ màu đỏ hoài, nhờ các bác sửa giúp

PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If Cells(i, 1) <> "" Then
                k = i
                Cells(k, 2).Formula = "=sum(R[-1]C:R" & "-["i-k"])C"
            End If
        Next
    End With
End Sub
 
Upvote 0
Tôi loay hoay quá, ngồi sửa mãi mà nó cứ màu đỏ hoài, nhờ các bác sửa giúp

PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If Cells(i, 1) <> "" Then
                k = i
                Cells(k, 2).Formula = "=sum(R[-1]C:R" & "-["i-k"])C"
            End If
        Next
    End With
End Sub
Viết vầy mới đúng cú pháp Cells(k, 2).Value ="sum(R[-1]C:R" & i-k & "C)"
Có điều k = i nên i - k sẽ = 0
i chạy từ 1, vậy R[-1] là dòng 0 à?
---> Vậy sao được chứ?
Cuối cùng bạn đang muốn tính cái gì đây?
 
Upvote 0
Tôi muốn thực tập viết cú pháp cho quen, bài toán tôi định làm là tính tổng thành phần thày ah, kính nhờ thày giúp cho
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If Cells(i, 1) <> "" Then
                k = i
                Cells(k, 2).Value = "sum(R[-1]C:R" & i - k & "C)"
            End If
        Next
    End With
End Sub
 

File đính kèm

  • Tong nhom.xls
    22.5 KB · Đọc: 14
Upvote 0
Tôi muốn thực tập viết cú pháp cho quen, bài toán tôi định làm là tính tổng thành phần thày ah, kính nhờ thày giúp cho
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If Cells(i, 1) <> "" Then
                k = i
                Cells(k, 2).Value = "sum(R[-1]C:R" & i - k & "C)"
            End If
        Next
    End With
End Sub
Vầy mới đúng:
PHP:
Sub Thunghiem()
  Dim i As Long, Dongcuoi As Long, k As Long
  Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
  k = Dongcuoi + 1
  With Sheet1
    For i = Dongcuoi To 1 Step -1
      If .Cells(i, 1).Value <> "" Then
        .Cells(i, 2).Value = "=sum(R" & k - 1 & "C:R" & i + 1 & "C)"
        k = i
      End If
    Next
  End With
End Sub
Cộng dồn phải For ngược từ dưới lên bạn à!
Ngoài ra bạn ghi With Sheet1 ở trên nhưng bên trong chẳng có gì liên quan đến Sheet1, sao mà được chứ?
 
Upvote 0
hoặc thế này cũng được, nếu đi từ trên xuống dưới
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If .Cells(i, 1) <> "" Then
                k = i
            Else
                .Cells(k, 2).Value = "=SUM(R[1]C:R[" & (i - k) & "]C)"
            End If
        Next
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi muốn thực tập viết cú pháp cho quen, bài toán tôi định làm là tính tổng thành phần thày ah, kính nhờ thày giúp cho
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If Cells(i, 1) <> "" Then
                k = i
                Cells(k, 2).Value = "sum(R[-1]C:R" & i - k & "C)"
            End If
        Next
    End With
End Sub
Với dạng bài này bạn nên duyệt từ dưới lên trên. Thuật toán như thế này: Duyệt từ dưới lên trên, nếu ô ở cột A rỗng thì cho k tăng 1 đơn vị, nếu ô ở cột A không rỗng thì gán công thức vào ô của cột bên cạnh và cho k = 0. Cứ thế cho đến hết. Thêm 1 điều kiện nữa là khi nào k lớn hơn 0 (tức là có dòng để cộng) thì mới gán công thức.
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = Dongcuoi To 1 Step -1
            If Cells(i, 1) = "" Then
                k = k + 1
            Else
                If k > 0 Then
                    Cells(i, 2).Value = "=sum(R[1]C:R[" & k & "]C)"
                    k = 0
                End If
            End If
        Next
    End With
End Sub
 
Upvote 0
hoặc thế này cũng được, nếu đi từ trên xuống dưới
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    With Sheet1
        For i = 1 To Dongcuoi
            If Cells(i, 1) <> "" Then
                k = i
            Else
                Cells(k, 2).Value = "=SUM(R[1]C:R[" & (i - k) & "]C)"
            End If
        Next
    End With
End Sub
Đương nhiên được nhưng tốc độ sẽ chậm hơn vì code phải làm việc nhiều hơn!
Bấm F8 theo dỏi code sẽ rõ điều này
 
Upvote 0
Cách giải trên chỉ mang tính tham khảo thôi, tối ưu nhất vẫn là đi từ dưới lên trên như thày Ndu và bác Huuthang-bd làm.

Bạn lưu ý: 1 số bài toán khác như thêm bớt dòng đi từ trên xuống dưới sẽ không chính xác.
 
Upvote 0
Sao tôi chạy Code của thày Ndu, nó lại tham chiếu tuyệt đối (=SUM(B$2:B$4)) mà không phải là tương đối
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    k = Dongcuoi + 1
    With Sheet1
        For i = Dongcuoi To 1 Step -1
            If .Cells(i, 1).Value <> "" Then
                .Cells(i, 2).Value = "=sum(R" & k - 1 & "C:R" & i + 1 & "C)"
                k = i
            End If
        Next
    End With
End Sub

Xin thày cho hỏi làm thế nào để chuyển tham chiếu tuyệt đối sang tương đối tức (=SUM(B$2:B$4) thành =SUM(B2:B4))
 
Upvote 0
Sao tôi chạy Code của thày Ndu, nó lại tham chiếu tuyệt đối (=SUM(B$2:B$4)) mà không phải là tương đối
PHP:
Sub Thunghiem()
    Dim i As Long, Dongcuoi As Long, k As Long
    Dongcuoi = Sheet1.Range("B65000").End(xlUp).Row
    k = Dongcuoi + 1
    With Sheet1
        For i = Dongcuoi To 1 Step -1
            If .Cells(i, 1).Value <> "" Then
                .Cells(i, 2).Value = "=sum(R" & k - 1 & "C:R" & i + 1 & "C)"
                k = i
            End If
        Next
    End With
End Sub

Xin thày cho hỏi làm thế nào để chuyển tham chiếu tuyệt đối sang tương đối tức (=SUM(B$2:B$4) thành =SUM(B2:B4))
Sửa vầy sẽ thành địa chỉ tương đối thôi: .Cells(i, 2).Value = "=SUM(R[1]C:R[" & k - i - 1 & "]C)"
 
Upvote 0
Sao lại thế nhỉ, nhìn 2 cái
PHP:
.Cells(i, 2).Value = "=sum(R" & k - 1 & "C:R" & i + 1 & "C)"

PHP:
.Cells(i, 2).Value = "=SUM(R[1]C:R[" & k - i - 1 & "]C)"

Đâu có gì khác nhau?


lạ quá, tôi làm thử thay đổi 2 dòng này cho kết quả khác nhau, xin thày dạy dùm
PHP:
.Cells(i, 2).Value = "=SUM(R[1]C:R[" & k - i - 1 & "]C)"
PHP:
.Cells(i, 2).Value = "=SUM(R1C:R" & k - i - 1 & "C)"
khác nhau như thế nào thày nhỉ?

Vậy, tác dụng của dấu ngoặc vuông ([]) ở đây đóng vai trò gì ?
-----------
Ah, tôi hiểu rồi dấu ngoặc vuông chính là biểu thị của sự tương đối, nếu không có nó biểu thị tuyệt đối (trước tôi cứ nghĩ nó chỉ là dấu đóng mở ngoặc thôi).

Nhờ có bài của thày Ndu mà tôi biết về điều tưởng đơn giản này, cảm ơn thày rất nhiều.
 
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