Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,911
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Mình có cái này muốn hỏi, nhưng thấy code đơn giản nên mạo phép đưa vào mục này cho các bạn mới theo luôn.

Sao code sau đây lại lỗi nhỉ, mục đích là điền công thức vào ô Ci?

HTML:
Sub Giai()
   Sheets("Huong Dan").Select
      For i = 3 To 6
         Range("c" & i).Formula = "A" & i + "b" & i
      Next i
End Sub

Nếu thay .Formula bằng .Value cũng lỗi luôn, thêm 02 ngoặc kép cũng lỗi luôn.
 
Upvote 0
Mình có cái này muốn hỏi, nhưng thấy code đơn giản nên mạo phép đưa vào mục này cho các bạn mới theo luôn.

Sao code sau đây lại lỗi nhỉ, mục đích là điền công thức vào ô Ci?

HTML:
Sub Giai()
   Sheets("Huong Dan").Select
      For i = 3 To 6
         Range("c" & i).Formula = "A" & i + "b" & i
      Next i
End Sub

Nếu thay .Formula bằng .Value cũng lỗi luôn, thêm 02 ngoặc kép cũng lỗi luôn.
Đây là câu hỏi chứ không phải câu đố, đã có một topic riêng dùng để giải thích, gỡ rối về code. Lần sau bạn nên post bài đúng chỗ.
Về câu hỏi của bạn, bạn sửa code lại thành như thế này thử xem sao:

PHP:
Sub Giai()
Sheets("Huong Dan").Select
      For i = 3 To 6
         Range("c" & i).Formula = "=A" & i & "+B" & i
      Next i
End Sub
Do bạn không giải thích gì hết nên tôi chỉ làm theo phán đoán cá nhân của tôi, có thể không đúng ý bạn.
 
Upvote 0
Xác định địa chỉ của vùng chứa Shape

Giả sử trên bảng tính tôi vẽ 1 Shape
Câu hỏi: Làm sao xác định được địa chỉ của vùng chứa Shape ấy

Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • DiaChiShape.xls
    55 KB · Đọc: 28
Upvote 0
Code VBA định dạng phân cách ngàn cho 1 vùng

Giả sử tôi có dữ liệu tại A1:A10 là number
Tôi muốn viết code để định dạng phân cách ngàn cho vùng này. Vậy xin hỏi tôi phải viết thế nào mới đúng?
Lưu ý rằng:
- Tôi chưa biết dấu phân cách ngàn trong Control Panel đang quy định thế nào
- Tôi cũng chưa biết mục "Use system separators" trong Excel Optionsđang check hay chưa
 
Upvote 0
Giả sử tôi có dữ liệu tại A1:A10 là number
Tôi muốn viết code để định dạng phân cách ngàn cho vùng này. Vậy xin hỏi tôi phải viết thế nào mới đúng?
Lưu ý rằng:
- Tôi chưa biết dấu phân cách ngàn trong Control Panel đang quy định thế nào
- Tôi cũng chưa biết mục "Use system separators" trong Excel Optionsđang check hay chưa
Theo em thì khi định dạng dấu phân cách hàng ngàn bằng Macro thì luôn luôn dùng dấu phẩy (,). Thiết lập của hệ thống hay của Excel không ảnh hưởng.
Code chỉ cần như thế này thôi.
Mã:
[A1:A10].NumberFormat = "#,#"
 
Upvote 0
Nạp giá trị cho 1 biến

Lấy 1 ví dụ:
Mã:
s = "[COLOR=#0000cd][B]Hello[/B][/COLOR]"
MsgBox s
Điều đương nhiên cái MsgBox ta nhận được là "Hello" rồi
Vậy xin hỏi: Có khi nào ta nạp giá trị cho 1 biến xong nhưng giá trị của biến ấy lại không đúng bằng với giá trị ban đầu hay không? (nạp vào là giá trị a nào đó nhưng MsgBox lại hiện kết quả là b)
Đương nhiên sau khi nạp xong giá trị cho biến thì MsgBox ngay, không thêm quá trình tính toán gì cả

Ẹc... Ẹc...
(câu này.. dễ nhỉ?)
 
Upvote 0
Lấy 1 ví dụ:
Mã:
s = "[COLOR=#0000cd][B]Hello[/B][/COLOR]"
MsgBox s
Điều đương nhiên cái MsgBox ta nhận được là "Hello" rồi
Vậy xin hỏi: Có khi nào ta nạp giá trị cho 1 biến xong nhưng giá trị của biến ấy lại không đúng bằng với giá trị ban đầu hay không? (nạp vào là giá trị a nào đó nhưng MsgBox lại hiện kết quả là b)
Đương nhiên sau khi nạp xong giá trị cho biến thì MsgBox ngay, không thêm quá trình tính toán gì cả

Ẹc... Ẹc...
(câu này.. dễ nhỉ?)
NDU đố VBA à? Thứ 7 lại ra vế đố thư giãn phải không?
 
Upvote 0
Lấy 1 ví dụ:
Mã:
s = "[COLOR=#0000cd][B]Hello[/B][/COLOR]"
MsgBox s
Điều đương nhiên cái MsgBox ta nhận được là "Hello" rồi
Vậy xin hỏi: Có khi nào ta nạp giá trị cho 1 biến xong nhưng giá trị của biến ấy lại không đúng bằng với giá trị ban đầu hay không? (nạp vào là giá trị a nào đó nhưng MsgBox lại hiện kết quả là b)
Đương nhiên sau khi nạp xong giá trị cho biến thì MsgBox ngay, không thêm quá trình tính toán gì cả

Ẹc... Ẹc...
(câu này.. dễ nhỉ?)
Có dùng Arr không Thầy?
 
Upvote 0
Cái này có được tính không?
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = [A1].Address Then
Application.EnableEvents = False
[A1] = [A1] * 5
Application.EnableEvents = True
End If
End Sub


Sub GPE()
Dim r As Range
Set r = [A1]
r = 5
MsgBox r
End Sub
 
Upvote 0
Mã:
Sub test()
Dim a As Long
a = "01"
MsgBox a
End Sub

Chú Tuấn không giới hạn luôn là có cho xài hàm hay khai báo biến không nhỉ. Nếu thể theo ý của chú thì kyo nghĩ là kyo gán vào a một chuỗi "01" và xuất ra msgbox là 1 chứ không phải là 01. Không biết vầy có được tính không?
 
Upvote 0
Nếu không cho tính toán ở Arr thì mình tạo 2 sub, sau đó gọi sub mình cần, hic

Mã:
Dim s As String
Sub s1()
    s = "Hello GPE"
    MsgBox s
End Sub

Sub s2()
    s = "Hello Giai Phap Excel"
    MsgBox s
End Sub

Sub Test()
    s1
    
End Sub
 
Upvote 0
Như thế này mà nhập thập phân vào nó cũng tự động đổi

Mã:
Sub th()
Dim m As Integer
m = InputBox("Nhap so")
MsgBox m
End Sub
 
Upvote 0
Chính xác là giống như kyo và anh sealand đã làm đấy. Tức:
- Khai báo biến là Long
- Gán biến = Số thập phân
- MsgBox chắc chắn không phải là số thập phân rồi
Có nghĩa là kiểu biến làm thay đổi giá trị của biến
---------------
Cái của anh LuânHai Lúa gọi là... ĂN GIAN
Ẹc... Ẹc...
 
Upvote 0
Chính xác là giống như kyo và anh sealand đã làm đấy. Tức:
- Khai báo biến là Long
- Gán biến = Số thập phân
- MsgBox chắc chắn không phải là số thập phân rồi
Có nghĩa là kiểu biến làm thay đổi giá trị của biến
---------------
Cái của anh LuânHai Lúa gọi là... ĂN GIAN
Ẹc... Ẹc...

Trong lập trình, tình huống giá trị của biến bị thay đổi ngoài tầm kiểm soát vẫn thường xảy ra - đặc biệt đối với các ngôn ngữ mà việc kiểm tra phép gán không chặt.
Với bài của NDU, tôi thì đang nghĩ tới hiệu ứng multi-task (đa nhiệm) -khi 1 tiến trình chưa kết thúc mà tiến trình kế tiếp đã được gọi thì cũng có thể xảy ra tình huống này (trong visual-fox hay gặp như thế); hoặc trong lập trình hướng đối tượng có thể xảy ra sự kiện thay đổi giá trị của biến một cách tự động...
Dẫu sao cũng có 1 thư giãn nho nhỏ cuối tuần!
 
Upvote 0
Trong lập trình, tình huống giá trị của biến bị thay đổi ngoài tầm kiểm soát vẫn thường xảy ra - đặc biệt đối với các ngôn ngữ mà việc kiểm tra phép gán không chặt.

Tôi nghĩ từ "đặc biệt" là không chính xác. Phải là "chỉ̉".
Bạn có thể gán được trong VBA nhưng với Delphi chẳng hạn thì bạn không gán được. Delphi không compile code như thế, nó báo lỗi ngay, chứ chưa nói tới chuyên chạy code.
Vd. khai biến a là Integer (4 bai, như VBA là Long) thì bạn không thể gán a = 1.0 chứ chưa nói tới chuyện gán a = 1.25
Trong VBA làm thế được vì VBA "cho phép" như thế

Với bài của NDU, tôi thì đang nghĩ tới hiệu ứng multi-task (đa nhiệm) -khi 1 tiến trình chưa kết thúc mà tiến trình kế tiếp đã được gọi

Tôi không rõ "multi-task" của bạn là gì nhưng nếu nói tới luồng - Thread - thì có những lúc code chạy sai. Nhưng sai là vì người lập trình làm ẩu, không kiểm soát được code của mình, không kiểm soát được các thread mình tạo ra.
Trong Windows có nhiều cơ cấu dùng để "đợi" vd. như WaitFor***, cơ cấu CreateEvent, SetEvent, ResetEvent v...v

hoặc trong lập trình hướng đối tượng có thể xảy ra sự kiện thay đổi giá trị của biến một cách tự động...

Nếu có thế thì là do code viết chưa chuẩn. Chứ làm gì có code chuẩn mà kết quả chạy nó phụ thuộc vào may rủi?
 
Upvote 0
Chuyển Sheet CodeName thành Sheet Name

Giả sử tôi có 3 sheet
- Sheet thứ nhất có tên là "Nguyễn" và Sheet CodeName là "S1"
- Sheet thứ hai có tên là "Anh" và Sheet CodeName là "S2"
- Sheet thứ ba có tên là "Tuấn" và Sheet CodeName là "S3"
-----------
Giờ ta gõ:
- Cell A1 chữ S1
- Cell A2 chữ S2
- Cell A3 chữ S3
Xin hỏi: Dùng code thế nào để:
- Kết quả tại B1 là Nguyễn
- Kết quả tại B2 là Anh
- Kết quả tại B3 là Tuấn
-------------
Tức biến đầu vào là Sheet CodeName (dạng String) và kết quả đầu ra là Sheet Name (dạng String)
 
Upvote 0
Giả sử tôi có 3 sheet
- Sheet thứ nhất có tên là "Nguyễn" và Sheet CodeName là "S1"
- Sheet thứ hai có tên là "Anh" và Sheet CodeName là "S2"
- Sheet thứ ba có tên là "Tuấn" và Sheet CodeName là "S3"
-----------
Giờ ta gõ:
- Cell A1 chữ S1
- Cell A2 chữ S2
- Cell A3 chữ S3
Xin hỏi: Dùng code thế nào để:
- Kết quả tại B1 là Nguyễn
- Kết quả tại B2 là Anh
- Kết quả tại B3 là Tuấn
-------------
Tức biến đầu vào là Sheet CodeName (dạng String) và kết quả đầu ra là Sheet Name (dạng String)

Vậy cũng được nè:
Mã:
Function ShName(ByVal shCodeName As String) As String
    Dim sh As Worksheet
    For Each sh In Sheets
        If sh.CodeName = shCodeName Then ShName = sh.Name
    Next
End Function
 
Upvote 0
Vậy cũng được nè:
Mã:
Function ShName(ByVal shCodeName As String) As String
    Dim sh As Worksheet
    For Each sh In Sheets
        If sh.CodeName = shCodeName Then ShName = sh.Name
    Next
End Function
Tạm chấp nhận
Tăng độ khó nha anh: Không dùng vòng để kiểm tra mà chuyển đổi trực tiếp luôn
Ẹc... Ẹc...
(Đố vui mà, đương nhiên phải có điểm khác biệt)
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom