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:
Tôi có đôi chút thắc mắc về Code của thày Ndu, xin được mọi người chỉ bảo giúp tôi học hỏi thêm

1) Theo tôi thì thuộc tính mặc định của Range hoặc Cell trong các biểu thức ưu tiên sẽ là Value, như vậy việc bỏ Value đi có ảnh hưởng gì không?
Đúng ra thì không sao, nhưng khuyên bạn nên tập thói quen cái gì cũng nên viết cho rõ ràng (tường mình) ---> Chừng nào bạn "đi" được rồi hẳn "chạy" cũng chưa muộn

2) Tôi thắc mắc là tại sao lại cần dòng ReDim Arr(1 to 1) ở dưới nhằm mục đích gì, vì tôi bỏ đi vẫn thấy nó đúng mà.
Tại tôi cẩn thận thôi... Khi n = 0 rồi thì phần ở trên ReDim Preserve đã quá đủ (Mục đích Dim Arr(1 to 1) ở dưới là muốn xóa sạch mảng ấy mà)
--------
Tôi xin thắc mắc về cách viết cú pháp chút nữa:

Trong đoạn
PHP:
.Cells(i, 3).Value = "=SUM(R[1]C:R[" & k - i & "]C)"
thì dấu ) nằm trong "" (tức là "]C)").

Tại sao đoạn
PHP:
.Cells(i, 3) = "=" & Join(Arr, "+")
thì dấu ngoặc không "bị" nằm trong dấu "", mặc dù tôi thấy vai trò của nó như nhau.
2 thằng này khác nhau hoàn toàn mà bạn, đâu có gì tương ứng nhau mà bạn so sánh như vậy chứ (1 cái là chuổi, 1 cái là hàm Join, chẳng ăn nhậu gì nhau)
 
Upvote 0
Em cứ tưởng là Join nó giống như Concatenate trong Excel, nghĩa là em cứ nghĩ ô C3 (tức Cells(1,3)) nó nối tất cả các phần tử của cả 2 mảng Tmp1 và Tmp2 vào với nhau

Em nghĩ có thể dùng được
Join(mang1, mang2)

Em chỉ thử nghiệm để biết cách dùng của Join thôi, em đang đi tìm hiểu những cái mới mà em chưa biết thày ah.
--------
Em đang tìm hiểu về Mid trong VBA em viết như trong Excel nhưng chưa được:

PHP:
Sub Tach()
    Dim sArr, Tmp(), sArr2, Tmp2(), i As Long, j As Long
    sArr = Range("A1:A10").Value
    ReDim Tmp(UBound(sArr, 1) - 1)
    For i = 1 To UBound(sArr, 1)
        Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i,1))
        n = n + 1
    Next
    [B1].Resize(n).Value = Tmp
End Sub
Chổ này: Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i,1))
thiếu dấu ngoặc ở cuối
 
Upvote 0
Thưa thày đúng là tôi chưa hiểu sâu về hai hàm SumJoin lúc này khác nhau thế nào, tại sao trong các cách dùng không bình đẳng?

Rất kính mong thày giảng cho chỗ này để lần sau tôi viết không bị lúng túng, nhầm lẫn nữa.
 
Upvote 0
Em sửa Code thành
PHP:
 Sub Tach()
    Dim sArr, Tmp(), i As Long, j As Long
    sArr = Range("A1:A10").Value
    ReDim Tmp(UBound(sArr, 1) - 1)
    For i = 1 To UBound(sArr, 1)
        Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i, 1)))
        n = n + 1
    Next i
    [B1].Resize(n).Value = Tmp
End Sub

Em tiến hành chạy Code kết quả ra không như em mong muốn:
Cụ thể kết quả chạy Code ra toàn bộ các ô B1 đến B10 nó đều tách ra từ A1 (giá trị từ B1 đến B10 bằng nhau.

Trong khi mục đích của em là ô Bi tách ra từ Ai tương ứng (i = 1 to 10)
 

File đính kèm

  • Tach.xls
    21.5 KB · Đọc: 7
Upvote 0
Thưa thày đúng là tôi chưa hiểu sâu về hai hàm SumJoin lúc này khác nhau thế nào, tại sao trong các cách dùng không bình đẳng?

Rất kính mong thày giảng cho chỗ này để lần sau tôi viết không bị lúng túng, nhầm lẫn nữa.
Cái thằng SUM ấy chẳng qua chỉ là 1 chuổi, gán xuống sheet nó hiểu thành hàm SUM thôi (trong VBA nó chẳng hiểu đấy là hàm đâu)
Còn thằng Join thì đúng là hàm thật sự trong VBA
 
Upvote 0
Em sửa Code thành
PHP:
 Sub Tach()
    Dim sArr, Tmp(), i As Long, j As Long
    sArr = Range("A1:A10").Value
    ReDim Tmp(UBound(sArr, 1) - 1)
    For i = 1 To UBound(sArr, 1)
        Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i, 1)))
        n = n + 1
    Next i
    [B1].Resize(n).Value = Tmp
End Sub

Em tiến hành chạy Code kết quả ra không như em mong muốn:
Cụ thể kết quả chạy Code ra toàn bộ các ô B1 đến B10 nó đều tách ra từ A1 (giá trị từ B1 đến B10 bằng nhau.

Trong khi mục đích của em là ô Bi tách ra từ Ai tương ứng (i = 1 to 10)
Vì tmp là mảng 1 chiều ---> Gán xuống sheet theo chiều dọc nó chỉ lấy được phần tử đâu tiên thôi
Sửa lại thế này:
Mã:
 Sub Tach()
  Dim sArr, Tmp(), i As Long, j As Long, n As Long
  sArr = Range("A1:A10").Value
  ReDim Tmp(UBound(sArr, 1) - 1[COLOR=#ff0000][B], 0[/B][/COLOR])
  For i = 1 To UBound(sArr, 1)
    Tmp(i - 1[COLOR=#ff0000][B], 0[/B][/COLOR]) = Mid(sArr(i, 1), 2, Len(sArr(i, 1)))
    n = n + 1
  Next i
  [B1].Resize(n).Value = Tmp
End Sub
 
Upvote 0
Thì ra là vậy, nhưng thày ơi căn cứ vào đâu (làm sao biết được):
1) những hàm trong Excel (đồng thời là hàm trong VBA),
2) Những hàm nào chỉ của riêng Excel (nhưng VBA không coi nó là hàm).
 
Upvote 0
Thì ra là vậy, nhưng thày ơi căn cứ vào đâu (làm sao biết được):
1) những hàm trong Excel (đồng thời là hàm trong VBA),
2) Những hàm nào chỉ của riêng Excel (nhưng VBA không coi nó là hàm).
Thật ra ý tôi nói là vầy:
- Đoạn "=SUM(..... )" gì gì đó trong VBA chỉ xem là chuối(do bao bọc bởi cặp dấu nháy kép)... khi gán xuống sheet, do có dấu bằng đằng trước chuổi, kết hợp với tật cả những thành phần bên trong SUM( đều hợp quy tắc của hàm SUM nên bảng tính tự động hiểu đấy là 1 công thức (chứ không phải vì lý do hàm ấy có hay không có trong VBA)
Nó gần giống như cách người ta làm tại đây:
http://www.giaiphapexcel.com/forum/...o-thả-dữ-liệu-nhảy-cách-!&p=383603#post383603
(thay dấu # thành dấu = và Excel tự động hiểu đó là công thức)
--------------------------
Còn vấn đề bạn muốn biết hàm nào có trong VBA thì cứ Alt + F11, xong bấm F2 sẽ thấy tất cả
 
Upvote 0
Tôi về luyện tập tự mình làm lại ví dụ lúc sáng mà thày Ndu đã giúp, khi so sánh 2 Code tôi có thắc mắc về thứ tự dòng lệnh, cụ thể như sau:

Nguyên văn Code của thày
PHP:
Sub TinhTong()
  Dim i As Long, Dongcuoi As Long, k As Long, n As Long, Arr()
  Dongcuoi = Sheet1.Range("C65000").End(xlUp).Row
  ReDim Arr(1 To 1)
  k = Dongcuoi
  With Sheet1
    For i = Dongcuoi To 1 Step -1
      If .Cells(i, 2).Value <> "" And .Cells(i, 1) = "" Then
        .Cells(i, 3).Value = "=SUM(R[1]C:R[" & k - i & "]C)"
        k = i - 1: n = n + 1
        ReDim Preserve Arr(1 To n)
        Arr(n) = .Cells(i, 3).Address(0, 0)
      ElseIf .Cells(i, 1) <> "" Then
        k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
        ReDim Arr(1 To 1)
      End If
    Next
  End With
End Sub

Bản thân tôi nghĩ đoạn này của thày
PHP:
k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
đúng ra phải đổi thứ tự lại thành
PHP:
 .Cells(i, 3).Value = "=" & Join(Arr, "+")
k = i - 1: n = 0
mới đúng bản chất vấn đề chứ?

Tuy vậy, khi Test tôi thấy kết quả 2 trường hợp trên là giống nhau.

Tôi vẫn băn khoăn là làm như của thày Ndu có nghĩa n = 0 trước --->Arr(n) làm gì còn (vì Arr(n)=Arr(0)=0? thế thì tại sao những cái "đã gom" được trước đây sao nó vẫn cộng vào?), mong được thày giúp cho.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi về luyện tập tự mình làm lại ví dụ lúc sáng mà thày Ndu đã giúp, khi so sánh 2 Code tôi có thắc mắc về thứ tự dòng lệnh, cụ thể như sau:

Nguyên văn Code của thày
PHP:
Sub TinhTong()
  Dim i As Long, Dongcuoi As Long, k As Long, n As Long, Arr()
  Dongcuoi = Sheet1.Range("C65000").End(xlUp).Row
  ReDim Arr(1 To 1)
  k = Dongcuoi
  With Sheet1
    For i = Dongcuoi To 1 Step -1
      If .Cells(i, 2).Value <> "" And .Cells(i, 1) = "" Then
        .Cells(i, 3).Value = "=SUM(R[1]C:R[" & k - i & "]C)"
        k = i - 1: n = n + 1
        ReDim Preserve Arr(1 To n)
        Arr(n) = .Cells(i, 3).Address(0, 0)
      ElseIf .Cells(i, 1) <> "" Then
        k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
        ReDim Arr(1 To 1)
      End If
    Next
  End With
End Sub

Bản thân tôi nghĩ đoạn này của thày
PHP:
k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
đúng ra phải đổi thứ tự lại thành
PHP:
 .Cells(i, 3).Value = "=" & Join(Arr, "+")
k = i - 1: n = 0
mới đúng bản chất vấn đề chứ?

Tuy vậy, khi Test tôi thấy kết quả 2 trường hợp trên là giống nhau.

Tôi vẫn băn khoăn là làm như của thày Ndu có nghĩa n = 0 trước --->Arr(n) làm gì còn (vì Arr(n)=Arr(0)=0? thế thì tại sao những cái "đã gom" được trước đây sao nó vẫn cộng vào?), mong được thày giúp cho.
Arr(n) là 1 phần tử trong Arr (phần tử thứ n), còn Join(Arr, "+") là làm việc với nguyên thằng Arr luôn, có liên quan gì đến n đâu chứ
2 đoạn ấy, cái nào trước cái nào sau cũng chẳng ảnh hưởng gì
 
Upvote 0
Về phần mảng tôi vẫn còn hơi NGỐ, rất mong thày chỉ bảo cho Arr được định nghĩa qua ReDim Preserve Arr(1 To n) tức nó không có phần tử 0 (Arr(0)), thế thì tại sao khi viết theo thứ tự cách 1
PHP:
k = i - 1: n = 0
    .Cells(i, 3).Value = "=" & Join(Arr, "+")
nó không bị lỗi nhỉ?
Bởi lúc này hàm Join có thêm phần tử Arr(0) mà.
 
Upvote 0
Về phần mảng tôi vẫn còn hơi NGỐ, rất mong thày chỉ bảo cho Arr được định nghĩa qua ReDim Preserve Arr(1 To n) tức nó không có phần tử 0 (Arr(0)), thế thì tại sao khi viết theo thứ tự cách 1
PHP:
k = i - 1: n = 0
    .Cells(i, 3).Value = "=" & Join(Arr, "+")
nó không bị lỗi nhỉ?
Bởi lúc này hàm Join có thêm phần tử Arr(0) mà.
n = 0 để chuẩn bị cho dòng lệnh phía trên:
Mã:
n = n + 1
ReDim Preserve Arr(1 To n)
Để khi n = n +1 thì n sẽ bắt đầu bằng 1 và ReDim Preserve Arr(1 To n) sẽ chỉnh kích thước mảng về còn 1 phần tử mà thôi
Còn phần Join(Arr, "+") thì Arr đã được tạo thành từ trước rồi, bây giờ cho dù n có bằng bao nhiêu cũng chẳng ảnh hưởng gì
Giống ví dụ này đây:
Mã:
n = 5
Arr = Range("A1").Resize(n).Value
n = 0
Bạn sẽ thấy Arr được tạo thành từ trước, nên sau đó n có thay đổi thì có ảnh hưởng gì đến Arr kia chứ (UBound(Arr) vẫn = 5 thôi)
Thêm 1 ví dụ khác:
Mã:
n= 5
tmp = n
n = 0
MsgBox tmp
Kết quả của MsgBox vẫn là 5 dù sau đó n có thay đổi thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
Được thày Ndu tận tình chỉ bảo, trước trình độ của tôi ù ù cạc cạc vẫn còn lơ mơ lắm, sau một thời gian kiên trì đọc các bài thày giải trên diễn đàn (bất cứ bài nào thày tham gia trên diễn đàn tối về buổi tối tôi đều nghiên cứu lại), tôi cố gắng mỗi hôm học được 1 chút kiến thức mới; qua bài vừa rồi, học được ở thày các khái niệm về ReDim Preserve Arr(1 to n), hàm Join, Address... sau khi thực hành thay đổi cách dùng nhằm hiểu hơn về các khái niệm đó, chiều nay tôi đã có thể tự giải quyết được các bài toán đơn giản rồi.

Một lần nữa xin cảm ơn tấm lòng của các anh, chị, các thày trên diễn đàn, đặc biệt là thày Ndu96081631. Nếu không nhờ công lao to lớn của mọi người thì chắc chẳng bao giờ tôi biết những điều kỳ diệu của VBA.
 
Upvote 0
Xin viết giùm em code cho button In trong sheet.

Trong sheet của em có thiết kế 2 botton dùng để in trang 1 và trang 2 đã được đặt tên là page1 và page2( file kèm theo). Bây giờ em muốn nhấn vào " In trang 1" và " In trang 2" thì excel sẽ tự động in ra. Rất mong được chỉ dấn. thanks GPE
 
Lần chỉnh sửa cuối:
Upvote 0
Trong sheet của em có thiết kế 2 botton dùng để in trang 1 và trang 2 đã được đặt tên là page1 và page2( file kèm theo). Bây giờ em muốn nhấn vào " In trang 1" và " In trang 2" thì excel sẽ tự động in ra. Rất mong được chỉ dấn. thanks GPE
Sao bạn không record macro để được code? Nghiên cứu cái này xem
PHP:
 ActiveSheet.PrintOut From:=2, To:=2, Copies:=1, Collate:=True
 
Upvote 0
Tôi đang cố gắng hệ thống ôn tập lại, thử lại các cách viết các câu lệnh, nhưng khi viết thế này (vẫn nhằm mục đích để hiện công thức ấy mà) nhưng không được, cụ thể:

PHP:
Sub tinhtong()
Cells(1, 4).Formula = "=" & Cells(1, 3).Address(0, 0)* Cells(1, 2).Address(0, 0)
End Sub

Xin nhờ mọi người sửa giúp
 
Upvote 0
Tôi đang cố gắng hệ thống ôn tập lại, thử lại các cách viết các câu lệnh, nhưng khi viết thế này (vẫn nhằm mục đích để hiện công thức ấy mà) nhưng không được, cụ thể:

PHP:
Sub tinhtong()
Cells(1, 4).Formula = "=" & Cells(1, 3).Address(0, 0)* Cells(1, 2).Address(0, 0)
End Sub

Xin nhờ mọi người sửa giúp

Hoặc là viết thế này:
Cells(1, 4).Value = Cells(1, 3) * Cells(1, 2)
Hoặc là viết thế này
Cells(1, 4).Formula = "=" & Cells(1, 3).Address(0, 0) & "*" & Cells(1, 2).Address(0, 0)
Còn cách của bạn thì... giống như xăng pha nhớt
Ẹc... Ẹc...
 
Upvote 0
Phần này tôi vẫn còn lúng túng, chưa thạo lắm, xin thày giúp cho chút nữa công thức sau phải sửa thế nào cho đúng

PHP:
Cells(i, 8).Formula = "=sum(R[1]C:R[" & kk - i & "]C)*" & Cells(i, 6).Address(0, 0)
 
Lần chỉnh sửa cuối:
Upvote 0
Phần này tôi vẫn còn lúng túng, chưa thạo lắm, xin thày giúp cho chút nữa công thức sau phải sửa thế nào cho đúng

PHP:
Cells(i, 8).Formula = "=sum(R[1]C:R[" & kk - i & "]C)*" & Cells(i, 6).Address(0, 0)
Bạn sửa công thức thành:
PHP:
Cells(i, 8).FormulaR1C1 = "=SUM(R[1]C:R[" & kk - i & "]C)*RC6"
Mấy chỗ như thế này thì cứ Record Macro là biết liền thôi mà. Bạn hãy thử đi!
 
Upvote 0
Bạn sửa công thức thành:
PHP:
Cells(i, 8).FormulaR1C1 = "=SUM(R[1]C:R[" & kk - i & "]C)*RC6"
Mấy chỗ như thế này thì cứ Record Macro là biết liền thôi mà. Bạn hãy thử đi!
Cái này:
Cells(i, 8).Formula = "=sum(R[1]C:R[" & kk - i & "]C)*RC[-2]"
Mới tương đương với Address(0,0)
 
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