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:
Sư phụ ơi, nhân tiện xem giúp em bài #275 ở trên với
Thú thực cái này mình chưa đủ công lực & cũng iếu hứng thú luôn!
Hay mượn cái "Thụy sỹ" đâu đó trên xa lộ ai để quên về xài đi, "Đồ Nội" mau hư lắm!
Chúc đứa con tinh thần của bạn khỏe mạnh & an lành!
--=0
 
Upvote 0
Thú thực cái này mình chưa đủ công lực & cũng iếu hứng thú luôn!
Hay mượn cái "Thụy sỹ" đâu đó trên xa lộ ai để quên về xài đi, "Đồ Nội" mau hư lắm!
Chúc đứa con tinh thần của bạn khỏe mạnh & an lành!
--=0
Àh... không phải em cần xài cái đồng hồ ấy... chỉ là thí nghiệm để học hỏi code thôi
Em cảm thấy ngạc nhiên, không biết nguyên nhân do đâu mà khi ta nhập liệu vào bất kỳ cell nào thì đồng hồ lập tức dừng ngay ---> điều gì làm cho nó dừng lại? Em nào có bấm nút dừng đâu?
Hay nói đúng hơn, điều em muốn hỏi ở đây là: Vòng lập Do While đang chạy ngon lành, sao tự nhiên không chạy tiếp?
 
Upvote 0
Àh... không phải em cần xài cái đồng hồ ấy... chỉ là thí nghiệm để học hỏi code thôi
Em cảm thấy ngạc nhiên, không biết nguyên nhân do đâu mà khi ta nhập liệu vào bất kỳ cell nào thì đồng hồ lập tức dừng ngay ---> điều gì làm cho nó dừng lại? Em nào có bấm nút dừng đâu?
Hay nói đúng hơn, điều em muốn hỏi ở đây là: Vòng lập Do While đang chạy ngon lành, sao tự nhiên không chạy tiếp?
Cái này cũng bị vậy... Di chuyển chuột thì không sao, nhưng hễ nhập liệu vào 1 ô là cái đồng hồ chết máy liền hà... Hỏng hiểu tại sao...

Nhưng khá hơn cái anh ndu96081631 chút... Nhập liệu xong (Enter) thì đồng hồ lại chạy tiếp, giống như nó đứng lại để xem mình làm gì vậy, rồi hỏng thấy có gì liên quan đến nó nên... thôi, việc ta ta làm.

Còn cái của anh ndu96081631 thì nhập liệu xong, Enter, cái đồng hồ vẫn đứng dòm, không chịu chạy tiếp.

Bài này, cảm ơn bác SA_DQ, em đã biết vận dụng cái WorkSheet_SelectionChange để làm cái ô Pause và Continue cho cái đồng hồ, khỏi cần vẽ cái nút.
 

File đính kèm

  • Clock.xls
    35 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Cái này cũng bị vậy... Di chuyển chuột thì không sao, nhưng hễ nhập liệu vào 1 ô là cái đồng hồ chết máy liền hà... Hỏng hiểu tại sao...

Nhưng khá hơn cái anh ndu96081631 chút... Nhập liệu xong (Enter) thì đồng hồ lại chạy tiếp, giống như nó đứng lại để xem mình làm gì vậy, rồi hỏng thấy có gì liên quan đến nó nên... thôi, việc ta ta làm.

Còn cái của anh ndu96081631 thì nhập liệu xong, Enter, cái đồng hồ vẫn đứng dòm, không chịu chạy tiếp.

Bài này, cảm ơn bác SA_DQ, em đã biết vận dụng cái WorkSheet_SelectionChange để làm cái ô Pause và Continue cho cái đồng hồ, khỏi cần vẽ cái nút.
Cái đồng hồ này chạy thế là ngon rồi còn gì! Có điều ý tôi không phải hỏi về cái đồng hồ (thuật toán 2 file khác nhau mà)
Ý tôi chỉ hỏi vòng lập trong file của tôi sao tự nhiên bị "đơ" không chạy tiếp
(chỉ mượn cái đồng hồ làm mẫu thôi)
--------
Riêng về code của BNTT, nếu chỉ chọn có 1 cell thì ta dùng Address gọn hơn Intersect
Ví dụ:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$1" Then StopRunClock
    If Target.Address = "$B$2" Then RunClock
End Sub
hoặc:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address(0,0) = "B1" Then StopRunClock
    If Target.Address(0,0)= "B2" Then RunClock
End Sub
Nếu chọn 1 dòng thì dùng Target.Row = ???
Nếu chọn 1 cột thì dùng Target.Column = ???
vân vân...
Intersect bạn chỉ nên xài trong trường hợp bạn muốn con trỏ chuột nằm trong 1 vùng xác định nào đó
Ví dụ:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("B1:D1")) Is Nothing Then StopRunClock
    If Not Intersect(Target, Range("B2:D2")) Is Nothing Then RunClock
End Sub
Khi này, vùng hoạt động của con trỏ chuột là B1:D1B2:D2
 
Upvote 0
Hic hic, anh ndu96081631 à, em đâu có biết... Thầy SA_DQ dạy cái gì thì em xài cái đó, thấy nó không báo lỗi, và chạy ngon, thì em cứ để yên à... Cảm ơn anh, lại thêm một chiêu nữa... Mấy thứ này hỏng có trong Help của VBE, mà nếu có thì đọc cũng chả hiểu nổi.

À, sẵn cho em hỏi tí:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$1" Then StopRunClock
    If Target.Address = "$B$2" Then RunClock
End Sub
Có cách nào mà khi nhấn (hay chọn) ô B1 thì nó Pause, rồi hễ thoát ra khỏi ô B1, hoặc là nhấn vào ô B1 một cái nữa, thì nó chạy tiếp hông? Nghĩa là chỉ "lập trình" cho mỗi cái ô B1 thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Hic hic, anh ndu96081631 à, em đâu có biết... Thầy SA_DQ dạy cái gì thì em xài cái đó, thấy nó không báo lỗi, và chạy ngon, thì em cứ để yên à... Cảm ơn anh, lại thêm một chiêu nữa... Mấy thứ này hỏng có trong Help của VBE, mà nếu có thì đọc cũng chả hiểu nổi.

À, sẵn cho em hỏi tí:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$1" Then StopRunClock
    If Target.Address = "$B$2" Then RunClock
End Sub
Có cách nào mà khi nhấn (hay chọn) ô B1 thì nó Pause, rồi hễ thoát ra khỏi ô B1, hoặc là nhấn vào ô B1 một cái nữa, thì nó chạy tiếp hông? Nghĩa là chỉ "lập trình" cho mỗi cái ô B1 thôi.
Được chứ... như code này đây
PHP:
Private Check As Byte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$B$1" Then
    Check = Check Xor -(Not Target)
    If Check Then
      RunClock
    Else
      StopRunClock
    End If
  End If
End Sub
Nhưng trong trường hợp này ta dùng Button sẽ hay và "an toàn" hơn!
 

File đính kèm

  • Clock.xls
    25 KB · Đọc: 14
Upvote 0
Em sửa lại như vầy cho ngắn hơn được hông:
PHP:
Private Check As Byte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If Target.Address = "$B$1" Then
          Check = Check Xor -(Not Target)
          If Check Then RunClock Else StopRunClock
     End If
End Sub

Và cho em hỏi: Xor nghĩa là gì vậy anh ?

Và cái này:
If Check Then RunClock Else StopRunClock​
Có thể viết như vầy không:
IIf(Check, RunClock, StopRunClock)​
 
Upvote 0
Tôi sửa lại code 1 tí, Bạn BNTT xài file mới này "an toàn" hơn (hàm Xor có vẻ không được ổn định)
PHP:
Option Explicit
Private Check As Byte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$B$1" Then
    Check = IIf(Check = 1, 0, 1)
    Range("B1") = Choose(Check + 1, "Start", "Stop")
    Run Choose(Check + 1, "StopRunClock", "RunClock")
  End If
End Sub
Em sửa lại như vầy cho ngắn hơn được hông:
PHP:
Private Check As Byte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If Target.Address = "$B$1" Then
          Check = Check Xor -(Not Target)
          If Check Then RunClock Else StopRunClock
     End If
End Sub
Và cho em hỏi: Xor nghĩa là gì vậy anh ?

Và cái này:
If Check Then RunClock Else StopRunClock​
Có thể viết như vầy không:
IIf(Check, RunClock, StopRunClock)
Không được, phải thế này:
Run IIf(Check, "RunClock", "StopRunClock")
 

File đính kèm

  • Clock_2.xls
    34.5 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Anh Ndu ơi...
Sửa lại giống anh nói, nó ra như thế này mỗi khi nhấn vào B1:
000-1077.jpg
Và nhấn vào Debug thì nó la làng như vầy:
001-65.jpg
 
Upvote 0
Anh Ndu ơi...
Sửa lại giống anh nói, nó ra như thế này mỗi khi nhấn vào B1:
000-1077.jpg
Và nhấn vào Debug thì nó la làng như vầy:
001-65.jpg
Thì ở trên tôi nói rồi đó: Hàm Xor có vẻ không ổn định (khi được khi không) ---> Chắc hiểu nguyên nhân nữa, nên đã sửa lại rồi!
(Xem file phía trên nhé)
 
Upvote 0
Tôi sửa lại code 1 tí, Bạn BNTT xài file mới này "an toàn" hơn (hàm Xor có vẻ không được ổn định)
PHP:
Option Explicit
Private Check As Byte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$B$1" Then
    Check = IIf(Check = 1, 0, 1)
    Range("B1") = Choose(Check + 1, "Start", "Stop")
    Run Choose(Check + 1, "StopRunClock", "RunClock")
  End If
End Sub

Không được, phải thế này:
Run IIf(Check, "RunClock", "StopRunClock")
Anh ơi, cái file này thì chạy được rồi... nhưng không giống ý đồ của em muốn (cũng có thể là cái em muốn nó trời ơi quá)...
Cái ô B1... Nếu dùng chuột, thì nhấn vào nó 1 cái, nó Pause (OK). Nhấn tiếp nó một cái nữa, nothing! Phải nhấn một ô khác, rồi quay lại nhấn nó, thì nó mới Play.
Còn nếu dùng bàn phím, chọn nó, nó Pause (OK)... nhưng muốn nó chạy tiếp thì phải chạy ra ngoài lấy đà rồi quay lại tông nó một cái, nó mới chịu chạy tiếp...

Em muốn là, với ô B1:
  • Nếu dùng chuột, nhấn một cái: Pause, nhấn tiếp một cái: Play, nhấn tiếp cái nữa: Pause, v.v...
  • Nếu dùng bàn phím: chọn nó: Pause, bỏ nó đi chỗ khác: Play, quay lại: Pause, đi ra: Play, v.v...
Liệu ý muốn này có trời ơi quá hông anh?
 
Upvote 0
Em muốn là, với ô B1:
  • Nếu dùng chuột, nhấn một cái: Pause, nhấn tiếp một cái: Play, nhấn tiếp cái nữa: Pause, v.v...
  • Nếu dùng bàn phím: chọn nó: Pause, bỏ nó đi chỗ khác: Play, quay lại: Pause, đi ra: Play, v.v...
Liệu ý muốn này có trời ơi quá hông anh?
Thế thì... ăn chắc không được... vì nếu ta không di chuột sang cell khác thì code không "cảm nhận" được có cái gì là SELECTIONCHANGE cả ---> Vì thế mà trong trường hợp này người ta sẽ xài nút nhấn
Thí nghiệm đơn giản đây:
PHP:
Private Check As Byte
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Address = "$A$1" Then
    Check = IIf(Check, 0, 1)
    MsgBox Check
  End If
End Sub
Bấm vào A1, 1 MsgBox xuất hiện
Nếu không dời chuột ra nơi khác mà cứ bấm tiếp thì chả có gì xuất hiện cả
Còn như bạn vẫn cố tình muốn thế thì ta chơi... tà đạo ---> sau khi chọn xong B1, cho con trỏ chuột chuyển sang cell bên cạnh luôn --> Target.Offset(1).Select chẳng hạn
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
Có thêm cách này

Có cách nào mà khi nhấn (hay chọn) ô B1 thì nó Pause, rồi hễ thoát ra khỏi ô B1, hoặc là nhấn vào ô B1 một cái nữa, thì nó chạy tiếp hông? Nghĩa là chỉ "lập trình" cho mỗi cái ô B1 thôi.

Khai báo 1 biến toàn cục kiểu Jes/No
Sau đó bấm ô nào đó (VD 'B1') & ra lệnh
1 Xoay chiều Jes=> No hay No => Jes
2 Nếu Jes thì làm thêm việc gì đó, như bửa cũi chẳng hạn. khà . . . :-= khà. . . :-= :-= :-=
 
Upvote 0
Khai báo 1 biến toàn cục kiểu Jes/No
Sau đó bấm ô nào đó (VD 'B1') & ra lệnh
1 Xoay chiều Jes=> No hay No => Jes
2 Nếu Jes thì làm thêm việc gì đó, như bửa cũi chẳng hạn. khà . . . :-= khà. . . :-= :-= :-=
"Khai báo 1 biến toàn cục kiểu Jes/No" có phải là: Private Biến as Boolean ?
Nhưng rồi... cái 1, 2 gì đó, cụ thể hơn được không, sư phụ ơi ?
 
Upvote 0
Khai báo 1 biến toàn cục kiểu Jes/No
Sau đó bấm ô nào đó (VD 'B1') & ra lệnh
1 Xoay chiều Jes=> No hay No => Jes
2 Nếu Jes thì làm thêm việc gì đó, như bửa cũi chẳng hạn. khà . . . :-= khà. . . :-= :-= :-=
Sau khi xoay chiều Yes, No xong, bạn hỏng chuyển chuột rồi bấm tiếp thì lấy gì Yes --> NoNo ---> Yes được ---> Code cũng chả bao giờ chạy
Điểm quan trọng: Code chạy được chủ yếu nhờ bấm chuột mà ra... Không có CHANGE sẽ không có CHẠY
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
công thức sort tự động

Mình đang cố gắng học các tuyệt chiêu của các bậc đàn anh, trong đó có Chiêu thứ 30: "Sort thứ tự dựa trên nhiều hơn 3 cột"
Code:
Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
Next i
End Sub


Mình muốn Sort ưu tiên theo cột A (giảm dần) và các cột B,C,D,E (tăng dần), các bạn giúp mình sửa code sao cho thỏa yêu cầu trên

Chiêu trên mình học của tác giả ptm 0412, mình không biết vế VBA nên không hiểu - giúp mình với - cảm ơn các bạn nhiều lắm !
 
Upvote 0
Mình đang cố gắng học các tuyệt chiêu của các bậc đàn anh, trong đó có Chiêu thứ 30: "Sort thứ tự dựa trên nhiều hơn 3 cột"
Code:
Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
Next i
End Sub


Mình muốn Sort ưu tiên theo cột A (giảm dần) và các cột B,C,D,E (tăng dần), các bạn giúp mình sửa code sao cho thỏa yêu cầu trên

Chiêu trên mình học của tác giả ptm 0412, mình không biết vế VBA nên không hiểu - giúp mình với - cảm ơn các bạn nhiều lắm !
Yêu cầu của bạn đâu cần dùng VBA đâu.
Bạn cứ sort lần lượt các cột theo thứ tự mức độ ưu tiên tăng dần (cái nào mức ưu tiên thấp thì sort trước, mức ưu tiên cao thì sort sau).
VBA cũng làm trên cở sở này thôi.
 
Upvote 0
Mình làm thử theo cách Sort thông thường thì khi dữ kiệu thay đổi, nó không luôn luôn sort theo ý mình, ví dụ ưu tiên cột A (luôn sorrt theo cách giảm dần), còn các cột còn lại thì luôn sorrt theo cách tăng dần - mỗi lần thay đổ dữ liệu thì mình phải sort lại - các bạn giúp mình với
 
Upvote 0
Mình làm thử theo cách Sort thông thường thì khi dữ kiệu thay đổi, nó không luôn luôn sort theo ý mình, ví dụ ưu tiên cột A (luôn sorrt theo cách giảm dần), còn các cột còn lại thì luôn sorrt theo cách tăng dần - mỗi lần thay đổ dữ liệu thì mình phải sort lại - các bạn giúp mình với
Không biết tại sao bạn làm sai. Có thể là do dữ liệu của bạn không liên tục. Tốt nhất là quét hết bảng dữ liệu (chừa cột tiêu đề ra). Sort cột nào thì Active cell trong cột đó. Làm lần lượt theo thứ tự ưu tiên giảm dần.
 
Upvote 0
Mình có thử nhiều lần nhưng không ổn, còn áp dụng đoạn code đã học ở chiêu thứ 30 thì luôn sort theo kiểu Ascending, có cách nào sửa code sao cho cột đầu tiên (theo thứ tự ưu tiên) thì descending, còn các cột còn lại thì Ascending - giúp mình với
Bằng cách sửa đoạn code sau:

Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
Next i
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