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:
Theo chổ tôi biết thì Set thường dùng để khai báo 1 vùng hoặc 1 Object (gần giống Define name ấy)
Còn chuyện Set... = nothing thì... tùy thói quen... Tôi thấy cũng chẳng cần, sau khi chạy xong code, biến sẽ tự giải phóng khỏi bộ nhớ (Nếu biến nằm dưới tên Sub)
Bạn xem bài này:
http://www.giaiphapexcel.com/forum/showpost.php?p=94013&postcount=12

Cái define name này ăn tiền đây...
Em đã được giải thích một lần nhưng rồi quên...he he nhưng lần này bác nói là giống Define name thì vụ này nhớ là cái chắc rồi

Cám ơn đại ân nhân
 
Upvote 0
Offset(1) có phải bằng offset(1,0)??

Rng.Offset(1).SpecialCells(12).EntireRow.Delete

Em xin được hỏi là Offset(1) ở đây có nghĩa trượt một row ạh? nếu ghi tắt như vậy có phải là offset(1,0) ko?

Xin cám ơn
 
Upvote 0
Em xin được hỏi là Offset(1) ở đây có nghĩa trượt một row ạh? nếu ghi tắt như vậy có phải là offset(1,0) ko?

Xin cám ơn
Cả OFFSETRESIZE đều có cú pháp giống nhau:
Ref.Offset(dòng, cột)
Ref.Resize(số dòng, số cột)

Trong 2 tham số này nếu ta bỏ đi 1 thì xem như là... KHÔNG LÀM GÌ (với tham số đó)
Cú pháp để bỏ bớt cột
Ref.Offset(x) <===> Ref.Offset(x, 0)
Ref.Resize(x)
<===>Ref.Resize(x, Ref.Columns.Count)

Cú pháp để bỏ bớt dòng
Ref.Offset(, y) <===>Ref.Offset(0, y)
Ref.Resize(, y) <===>Ref.Resize(Ref.Rows.Count, y)

(chú ý dấu phẩy màu đỏ)
 
Upvote 0
Currentregion?

Em học mãi mà vẫn ngu VBA...hic
Em xin hỏi thêm vụ này vì chưa biết phải làm thí nghiệm thế nào
Nếu
PHP:
Dim Rng As Range
 Set Rng = [A1].CurrentRegion

Giả sử cột dữ liệu không liên tục (cột A,B,C có dữ liệu;cột D trống; sau đó đến cột E có dữ liệu
Thì sau khi set như trên Rng có bao gồm cả cột E không?

Cám ơn bác
 
Upvote 0
Em học mãi mà vẫn ngu VBA...hic
Em xin hỏi thêm vụ này vì chưa biết phải làm thí nghiệm thế nào
Nếu
PHP:
Dim Rng As Range
 Set Rng = [A1].CurrentRegion
Giả sử cột dữ liệu không liên tục (cột A,B,C có dữ liệu;cột D trống; sau đó đến cột E có dữ liệu
Thì sau khi set như trên Rng có bao gồm cả cột E không?

Cám ơn bác
Ref.CurrentRegion dùng để set 1 vùng dử liệu có liên quan đến Ref
Vì cột D rổng nên đương nhiên E sẽ không được tính
Bạn thí nghiệm bằng cách:
- Chọn A1
- Bấm tổ hợp phím Ctrl + Shift + * (dấu * ở dưới số 8)
 
Upvote 0
PHP:
Option Explicit
Sub ConvertToText()
  Dim TempRng As Range, Original As Range
  Application.ScreenUpdating = False
  Set Original = ActiveCell
  With Sheet1.[A1].CurrentRegion
    Set TempRng = .Offset(, .Columns.Count).Resize(.Rows.Count, .Columns.Count)
    .NumberFormat = "@"
    TempRng.FormulaArray = "=TEXT(" & .Address & ",""@"")"
    TempRng.Copy
    TempRng.PasteSpecial 3
    .PasteSpecial 3
    TempRng.Clear
  End With
  Application.ScreenUpdating = True
  Original.Select
End Sub
Trên đây là đoạn code của Bác NDU, em chưa hiểu đoạn sau
1. Set Original = ActiveCell ' mình set như này để làm gì
Em xoá nó đi (cả đoạn duới Original.select ) em thấy code vẫn chạy

2. Set TempRng = .Offset(, .Columns.Count).Resize(.Rows.Count, .Columns.Count)
Có phải đoạn code này tạo ra một vùng "tạm thời --> như kiểu note pad ko?"
+ sẽ trượt đi .columns cột, resize đúng bằng kích thước dữ liệu ban đầu?
3. NumberFormat = "@" --> @ có nghĩa là chuyển về định dạng Text?

4. Và em chưa hiểu cả đoạn này nữa
TempRng.FormulaArray = "=TEXT(" & .Address & ",""@"")"

đoạn này sao ko phải là Formula mà thêm Array đằng sau ạh?
em khó hiểu nhất đoạn này
Các cao thủ chỉ dạy cho em.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Option Explicit
Sub ConvertToText()
  Dim TempRng As Range, Original As Range
  Application.ScreenUpdating = False
  Set Original = ActiveCell
  With Sheet1.[A1].CurrentRegion
    Set TempRng = .Offset(, .Columns.Count).Resize(.Rows.Count, .Columns.Count)
    .NumberFormat = "@"
    TempRng.FormulaArray = "=TEXT(" & .Address & ",""@"")"
    TempRng.Copy
    TempRng.PasteSpecial 3
    .PasteSpecial 3
    TempRng.Clear
  End With
  Application.ScreenUpdating = True
  Original.Select
End Sub
Trên đây là đoạn code của Bác NDU, em chưa hiểu đoạn sau
1. Set Original = ActiveCell ' mình set như này để làm gì
Em xoá nó đi (cả đoạn duới Original.select ) em thấy code vẫn chạy

2. Set TempRng = .Offset(, .Columns.Count).Resize(.Rows.Count, .Columns.Count)
Có phải đoạn code này tạo ra một vùng "tạm thời --> như kiểu note pad ko?"
+ sẽ trượt đi .columns cột, resize đúng bằng kích thước dữ liệu ban đầu?
3. NumberFormat = "@" --> @ có nghĩa là chuyển về định dạng Text?

4. Và em chưa hiểu cả đoạn này nữa
TempRng.FormulaArray = "=TEXT(" & .Address & ",""@"")"

đoạn này sao ko phải là Formula mà thêm Array đằng sau ạh?
em khó hiểu nhất đoạn này
Các cao thủ chỉ dạy cho em.
1> Set Original = ActiveCell chẳng qua là để nhớ lại ActiveCell... để sau khi chạy code xong, nó sẽ Select ngay cell củ (bạn thấy dưới cùng có Original.Select không?)
2> Gần giống như bạn nói... Nó sẽ tạo 1 vùng tạm nằm cạnh vùng gốc (về bên phải)
3> Chính xác
4> Như bạn gõ công thức thường thôi
Giả sử câu lệnh Sheet1.[A1].CurrentRegion xác định được 1 vùng = A1:C10 thì vùng TempRng sẽ = D1:F10 ---> Khi ấy ta quét chọn D1:F10 rồi gõ công thức:
=TEXT(A1:C10,"@") ---> Đơn giản thế thôi!
Bạn cứ record macro quá trình gõ công thức sẽ thấy ---> Chỉ có điều do ta chưa xác định được vùng dử liệu gốc từ đâu đến đâu nên phải ghi... & .Address &... (tức thằng Sheet1.[A1].CurrentRegion có địa chỉ là gì thì điền vào đây)
 
Upvote 0
Cám ơn Anh NDU chỉ dạy nhiệt tình
Set TempRng = .Offset(, .Columns.Count).Resize(.Rows.Count, .Columns.Count)
.NumberFormat = "@"
TempRng.FormulaArray = "=TEXT(" & .Address & ",""@"")"
TempRng.Copy
TempRng.PasteSpecial 3
.PasteSpecial 3
TempRng.Clear
Trong đoạn code trên chỉ thấy
-set vùng tạm thời " nằm bên phải"
- chuyển về text
- Copy
- Dán
- Xoá vùng tạm thời
---
Sao em ko thấy dán vào vào vùng (cần chuyển đổi nhỉ?) mà dán ngay tại TemRng (mà range này đã set là nằm bên phải "ảo" cơ mà?
.PasteSpecial 3 --> dòng này em thấy (.) lơ lửng nằm một mình vậy?

Em còn rất rất...ngốc trong VBA và excel.
Xin ANh nhẫn nại chỉ thêm?
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Anh NDU chỉ dạy nhiệt tình

Trong đoạn code trên chỉ thấy
-set vùng tạm thời " nằm bên phải"
- chuyển về text
- Copy
- Dán
- Xoá vùng tạm thời
---
Sao em ko thấy dán vào vào vùng (cần chuyển đổi nhỉ?) mà dán ngay tại TemRng (mà range này đã set là nằm bên phải "ảo" cơ mà?
.PasteSpecial 3 --> dòng này em thấy (.) lơ lửng nằm một mình vậy?

Em còn rất rất...ngốc trong VBA và excel.
Xin ANh nhẫn nại chỉ thêm?
Uh... có lẽ khi viết bị dư thôi ----> thì cừ xóa TempRng.PasteSpecial 3 vậy! Chừa lại thằng PasteSpecial 3 ---> tức dán trực tiếp vào vùng gốc luôn
Ẹc.. Ẹc...
 
Upvote 0
Cám ơn Anh NDU chỉ dạy nhiệt tình

Đó là kiểu cầm tay chỉ việc, bước đầu & 1 lần thôi;
Nhưng sau này cứ mãi vậy, bạn sẽ ỉ lại đó;

Mình chỉ cách này sẽ hay hơn xíu nè:

Dùng MsgBox để tìm hiểu thông tin từ máy khi nào bạn muốn

Tôi ví dụ:

PHP:
Dim Rng As Range
 
Set Rng = Cells.UsedRange.Offset(1)
' Bạn thêm câu lệnh sau để biết Rng sẽ là gì trong đó'
 MsgBox Rng.Address, , Rng.Resize( 3, 5)
' . . . . . '

Macro sẽ không hẹp hòi gì khi bạn hỏi nó; Nó không phải như chúng ta điểm này, có gì nó nói ngay!

Không tin bạn cứ thử bất cứ lúc nào

Tất nhiên cách này là cách chuối nhất; Chứ còn cách hiện đại hơn nữa kia!
Nhưng tạm thời vậy đã là hay với chúng ta rồi - những người tự học í mà!

Chớ phật lòng nha!
 
Lần chỉnh sửa cuối:
Upvote 0
Đó là kiểu cầm tay chỉ việc, bước đầu & 1 lần thôi;
Nhưng sau này cứ mãi vậy, bạn sẽ ỉ lại đó;

Mình chỉ cách này sẽ hay hơn xíu nè:

Dùng MsgBox để tìm hiểu thông tin từ máy khi nào bạn muốn

Tôi ví dụ:

PHP:
Dim Rng As Range
 
Set Rng = Cells.UsedRange.Offset(1)
' Bạn thêm câu lệnh sau để biết Rng sẽ là gì trong đó'
 MsgBox Rng.Address, , Rng.Resize( 3, 5)
' . . . . . '
Macro sẽ không hẹp hòi gì khi bạn hỏi nó; Nó không phải như chúng ta điểm này, có gì nó nói ngay!

Không tin bạn cứ thử bất cứ lúc nào

Tất nhiên cách này là cách chuối nhất; Chứ còn cách hiện đại hơn nữa kia!
Nhưng tạm thời vậy đã là hay với chúng ta rồi - những người tự học í mà!

Chớ phật lòng nha!
Em cũng hay làm theo cách này... Ngoài ra em còn dùng Select để biết thực sự vùng mà em đang cần là vùng nào (có đúng như em suy luận không)
Ví dụ
PHP:
Sub Test()
  With Range("A1").CurrentRegion
     .Select
     MsgBox "Dang chon vung 1, chuyen sang vung 2 nha"
     .Offset(, .Columns.Count).Select
  End With
End Sub
Ẹc... Ẹc...
 
Upvote 0
Em được hỏi khai báo biến ở đầu Sub và sau sub có gì khác nhau?

Các Huynh chỉ giúp
 
Upvote 0
Tôi làm 1 cái đồng hồ nằm trên cell A1, dựa vào code sau:
PHP:
Private Check As Boolean
Private Sub CommandButton1_Click()
  Check = (CommandButton1.Caption = "Start")
  CommandButton1.Caption = Choose(1 - Check, "Start", "Stop")
  Do While Check
    Range("A1").Value = Format(Now, "hh:mm:ss")
    DoEvents
  Loop
End Sub
- Bấm nút ---> Đồng hồ chạy
- Bâm nút lần nữa ---> Đồng hồ dừng
Code chạy không có vấn đề, chỉ có 1 trục trặc là: Khi đồng hồ chạy, chỉ cần ta nhập liệu vào 1 cell nào đó thì lập tức đồng hồ dừng ngay
Nhờ các cao thủ giúp cách khắc phục, sao cho đồng hồ vẫn chạy trong khi nhập liệu (nó chỉ dừng khi ta bấm nút)
 

File đính kèm

  • Clock_in_Cell.xls
    22.5 KB · Đọc: 29
Upvote 0
Worksheet_Change & Worksheet_SelectionChange là mấy thứ?

Cho tôi hỏi tí:
Worksheet_Change & Worksheet_SelectionChange khác nhau và giống nhau chỗ nào vậy?
 
Upvote 0
Cho tôi hỏi tí:
Worksheet_Change & Worksheet_SelectionChange khác nhau và giống nhau chỗ nào vậy?
- Hai cái này giống ở chổ đều là sự kiện CHANGE (tức thay đổi.. gì đó)
- Worksheet_Change dựa vào việc thay đổi dử liệu tại 1 cell hoặc 1 vùng nào đó mà chạy code
-Worksheet_SelectionChange dựa vào việc thay đổi con trỏ chuột (từ cell này sang cell khác) mà chạy code
 
Upvote 0
- Hai cái này giống ở chổ đều là sự kiện CHANGE (tức thay đổi.. gì đó)
- Worksheet_Change dựa vào việc thay đổi dử liệu tại 1 cell hoặc 1 vùng nào đó mà chạy code
-Worksheet_SelectionChange dựa vào việc thay đổi con trỏ chuột (từ cell này sang cell khác) mà chạy code
Khó hỉu quá. Vậy có phải là... Ví dụ em lập trình cho ô A1:
Nếu em gõ cái gì đó vào trong ô A1 thì chọn Worksheet_Change?
Còn khi em đang đứng ở A1 mà nhảy xuống A2 (hoặc đi đâu đó) thì chọn Worsheet_SelectionChange ?

Em chỉ hiểu đơn giản rằng:
- Change = Thay đổi
- SelectionChange = Thay đổi cái đang chọn

Thấy nó y chang nhau... Rắc rối thiệt.
 
Upvote 0
Em chỉ hiểu đơn giản rằng:
- Change = Thay đổi
- SelectionChange = Thay đổi cái đang chọn

Thấy nó y chang nhau... Rắc rối thiệt.

Bạn nhập 2 cái ni vô 1 sheet nào đó

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Columns("A:A")) Is Nothing Then _
      MsgBox "Change only"
End Sub
Mã:
[B]Private Sub Worksheet_SelectionChange(ByVal Target As Range)[/B]
 If Not Intersect(Target, Columns("A:A")) Is Nothing Then _
   MsgBox "SelectionChange"
[B]End Sub [/B]

Sau đó lần lượt thử các hành động sau:

(1) Di chuyển bằng chuột giữa các ô trong cột 'A'
Di chuyển bằng bàn phím như trên

(2) Thử nhập dữ liệu vô 1 trong các ô của cột nớ. sau đó {ENTER} chú ý từng hộp thoại xuất hiện
Sau đó có thể bấm chuột lên thanh công thức để đổi dữ liệu khác vô ô hiện hành xem sao?

(3) Chọn vài hàng & thêm dòng xem sao?

(4) Copy dữ liệu từ nơi khác vô 1 & sau đó là vài ô trong cột 'A' để xem các macro làm việc theo trình tự nào;

. . . . .

(n) Chọn vài ô trong 'A' nhập lên thanh công thức 'GPE', sau đó giữ fím {CTRL} & thực hiện {ENTER} coi chúng ra răng!

Chúc vui! :-=
 
Lần chỉnh sửa cuối:
Upvote 0
Sư phụ ơi, nhân tiện xem giúp em bài #275 ở trên với
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom