Đố 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
 
Theo anh nói vậy thì TRANSPOSE sẽ LUÔN LUÔN bị lỗi chứ đâu phải là ĐÔI KHI chứ

Sao vậy? Khi ta tạo mảng từ dữ liệu có sẵn, (thường là từ Range nguồn) làm sao ta biết trong dữ liệu có gì? đâu phải lúc nào mỗi phần tử trong mảng cũng dài hơn 255 để gây lỗi.
 
Upvote 0
Sao vậy? Khi ta tạo mảng từ dữ liệu có sẵn, (thường là từ Range nguồn) làm sao ta biết trong dữ liệu có gì? đâu phải lúc nào mỗi phần tử trong mảng cũng dài hơn 255 để gây lỗi.

Lúc đầu anh nói rằng: Có trường hợp mà "đôi khi" hàm TRANSPOSE sẽ bị lỗi
Nhưng bây giờ theo ví dụ anh đưa lên thì đâu phải vậy!
Nói đúng ra anh phải đố vầy: Trường hợp nào của dữ liệu mà TRANSPOSE LUÔN LUÔN bị lỗi (chứ hổng phải là đôi khi)
 
Upvote 0
Lúc đầu anh nói rằng: Có trường hợp mà "đôi khi" hàm TRANSPOSE sẽ bị lỗi
Nhưng bây giờ theo ví dụ anh đưa lên thì đâu phải vậy!
Nói đúng ra anh phải đố vầy: Trường hợp nào của dữ liệu mà TRANSPOSE LUÔN LUÔN bị lỗi (chứ hổng phải là đôi khi)
Nếu vậy thì còn gì đố nữa, giải luôn cho rồi, dữ liệu sao lường trước được, nghỉ chơi!
 
Upvote 0
Nếu vậy thì còn gì đố nữa, giải luôn cho rồi, dữ liệu sao lường trước được, nghỉ chơi!

Ý em nói là anh DÙNG TỪ KHÔNG ĐÚNG
Nếu nói "đôi khi" có nghĩa là với dữ liệu đó, dùng TRANSPOSE có khi được khi không? Còn nếu nói là "luôn luôn" thì với dữ liệu đó, TRANSPOSE nó luôn luôn bị lỗi ---> Hai chuyện khác nhau hoàn toàn mà anh!
Với trường hợp chuổi > 255 ký tự, hàm TRANSPOSE luôn luôn bị lỗi chứ đâu phải khi được khi không gì đâu chứ?
Em nói đúng không?
--------------
Cái chuyện dữ liệu không lường trước thì anh có cách chọn lựa: KHÔNG DÙNG TRANSPOSE
Ngoài cái vụ lỗi "đôi khi" của anh thì TRANSPOSE nó cũng biến đổi dữ liệu nên em chẳng khi nào dùng đến
 
Lần chỉnh sửa cuối:
Upvote 0
Thế mới "khoai" chớ! Mình ít dùng nhưng cũng nên biết chớ hỉ?
Câu trả lời ngắn gọn: Chỉ cần có (ít nhất) một phần tử trong mảng vượt quá 255 ký tự mà dùng hàm transpose để xoay mảng sẽ bị lỗi.

Để thử nghiệm chúng ta cùng xét một ví dụ dùng Transpose sau:
Mã:
Sub test1()
    Dim i&, j$, k&
    [COLOR=#0000cd]Dim arr(1 To 10, 1 To 500)[/COLOR]
    For i = 1 To 10
        For k = 1 To 500
            If k = 1 Then j = ""
           [COLOR=#ff0000] If k < 256 Then[/COLOR]
                j = Chr(64 + i) & j
                If i Mod 2 = 0 Then
                    arr(i, k) = "=LEN(RC[-1])"
                Else
                    arr(i, k) = j
                End If
           [COLOR=#ff0000] End If[/COLOR]
        Next
    Next
    Range("a1").Resize(500, 10) = Application.WorksheetFunction.Transpose(arr)
End Sub
Phát hiện ra 1 chuyện: Dòng code màu xanh chỉ cần sửa thành Dim arr(1 To 10, 1 To 500) as String là xong chuyện
Ẹc... Ẹc...
Tức code thành vầy:
Mã:
Sub test1()
  Dim i&, j$, k&
  Dim arr(1 To 10, 1 To 500)[COLOR=#ff0000] As String[/COLOR]
  For i = 1 To 10
    For k = 1 To 500
      If k = 1 Then j = ""
      j = Chr(64 + i) & j
      If i Mod 2 = 0 Then
        arr(i, k) = "=LEN(RC[-1])"
      Else
        arr(i, k) = j
      End If
    Next
  Next
  Range("a1").Resize(500, 10) = Application.WorksheetFunction.Transpose(arr)
End Sub
OK chứ anh!
Vậy suy ra: Vấn đề nằm ở bộ nhớ! Khai báo biến chính xác là OK tất
 
Upvote 0
Phát hiện ra 1 chuyện: Dòng code màu xanh chỉ cần sửa thành Dim arr(1 To 10, 1 To 500) as String là xong chuyện
Ẹc... Ẹc...
Tức code thành vầy:
Mã:
Sub test1()
  Dim i&, j$, k&
  Dim arr(1 To 10, 1 To 500)[COLOR=#ff0000] As String[/COLOR]
  For i = 1 To 10
    For k = 1 To 500
      If k = 1 Then j = ""
      j = Chr(64 + i) & j
      If i Mod 2 = 0 Then
        arr(i, k) = "=LEN(RC[-1])"
      Else
        arr(i, k) = j
      End If
    Next
  Next
  Range("a1").Resize(500, 10) = Application.WorksheetFunction.Transpose(arr)
End Sub
OK chứ anh!
Vậy suy ra: Vấn đề nằm ở bộ nhớ! Khai báo biến chính xác là OK tất

Với Excel 2003 thì chưa thể OK, vả lại mảng đưa vào Range đâu phải cột nào cũng String?
 
Upvote 0
Với Excel 2003 thì chưa thể OK, vả lại mảng đưa vào Range đâu phải cột nào cũng String?

Tóm lại là: Code như trên là để giải quyết câu đố vui của anh. Còn thực tế, chả ai lại đi xài TRANSPOSE cho nó mệt, nhất là với dữ liệu lớn, TRANSPOSE còn chậm hơn em dùng 2 vòng lập nữa là
 
Upvote 0
Giá trị FALSE và 0 có sự khác biệt

Khi ta mở cửa sổ Immediate, gõ code: ?FALSE = 0 rồi Enter, ta nhận được kết quả là True. Chứng tỏ giá trị FALSE luôn = 0
Tuy nhiên, trong một số trường hợp nào đó đối với biến Object thì FALSE chưa chắc giống với số 0
Đại khái khi ta dùng một property của object và set cho nó = FASLE sẽ thấy có sự khác biệt so với khi ta set nó =0
Các bạn thử tìm xem thuộc tính gì (trong object gì) có biểu hiện như vậy?
(hơi mông lung nha)
 
Upvote 0
Khi ta mở cửa sổ Immediate, gõ code: ?FALSE = 0 rồi Enter, ta nhận được kết quả là True. Chứng tỏ giá trị FALSE luôn = 0
Tuy nhiên, trong một số trường hợp nào đó đối với biến Object thì FALSE chưa chắc giống với số 0
Đại khái khi ta dùng một property của object và set cho nó = FASLE sẽ thấy có sự khác biệt so với khi ta set nó =0
Các bạn thử tìm xem thuộc tính gì (trong object gì) có biểu hiện như vậy?
(hơi mông lung nha)
Có phải là các optionbutton hay checkbox không anh : = Fasle = -4146
 
Upvote 0
Có phải là các optionbutton hay checkbox không anh : = Fasle = -4146
Thì mình có thể thử:
- Vẽ CheckBox v2 OptionButton (ActiveX Controls) lên Sheet1
- Check sẳn vào CheckBox và OptionButon
- Mở cửa sổ Immediate, gõ lệnh: Sheet1.CheckBox1.Value = False rồi Enter và xem kết quả
- Tiếp tục gõ: Sheet1.OptionButton1.Value = False rồi Enter và xem kết quả
- Bây giờ trở lại bảng tính, check vào CheckBox và OptionButton
- Xong, lại gõ vào cửa sổ Immediate dòng lệnh: Sheet1.CheckBox1.Value = 0Sheet1.OptionButton1.Value = 0
Bạn xem đâu có gì khác biệt trong 2 cách gán giá trị (FALSE hoặc 0)
-------------------
Ở đây tôi muốn đố mọi người xem thử có 1 object nào mà khi gán giá trị FALSE hoặc 0 cho thuộc tính (nào đó) thì nó sẽ thể hiện kết quả hoàn toàn khác biệt
 
Upvote 0
Trường hợp nào với hàm JOIN bị lỗi?

Trong Help có nói:

Join Function

Description

Returns a string created by joining a number of substrings contained in an array.

Syntax:

Join(sourcearray[, delimiter])

sourcearray: Required. One-dimensional array containing substrings to be joined.

delimiter: Optional. String character used to separate the substrings in the returned string. If omitted, the space character (" ") is used. If delimiter is a zero-length string (""), all items in the list are concatenated with no delimiters.

Như vậy hàm Join là một hàm tách thành một chuỗi từ một mảng một chiều, cách thực hiện:

Phần tử trong mảng là dạng chuỗi:

Mã:
Sub Macro8()
    Dim Arr()
    Arr = Array([COLOR=#0000ff]"Giai", "phap", "Excel", ".", "com"[/COLOR])
    MsgBox [COLOR=#ff0000]Join(Arr, "")[/COLOR]
End Sub

Phần tử trong mảng là dạng số:

Mã:
Sub Macro9()
    Dim Arr()
    Arr = Array([COLOR=#0000ff]1, 2, 3, 4, 5[/COLOR])
    MsgBox [COLOR=#ff0000]Join(Arr, ", ")[/COLOR]
End Sub


Câu đố đặt ra, Nếu thực hiện đúng cấu trúc, thì khi nào hàm Join sẽ bị lỗi?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Hiển thị tiếng Việt Unicode trên ComboBox (trên sheet)

Với ComboBox trên Sheet (hay ActiveX controls nói chung) thì việc hiển thị tiếng Việt Unicode thật sự có vấn đề:
- Khi ta bấm mũi tên xổ xuống của ComboBox, ta nhìn thấy tiếng Việt Unicode hiển thị rất tốt:

Untitled_1.jpg



















- Nhưng ngay khi chọn xong 1 Item rồi click chuột vào đâu đó trên bảng tính thì lập tức những ký tự có dấu bị biến thành dấu ?

Untitled_2.jpg


















Xin hỏi các bạn: Dùng cách gì để khắc phục tình trạng này? Tức có thể hiển thị tiếng Việt Unicode trên ComboBox trong mọi lúc
Câu hỏi này tuy là đố vui nhưng ứng dụng thiết thực đây
 
Upvote 0
Với ComboBox trên Sheet (hay ActiveX controls nói chung) thì việc hiển thị tiếng Việt Unicode thật sự có vấn đề:
- Khi ta bấm mũi tên xổ xuống của ComboBox, ta nhìn thấy tiếng Việt Unicode hiển thị rất tốt:

- Nhưng ngay khi chọn xong 1 Item rồi click chuột vào đâu đó trên bảng tính thì lập tức những ký tự có dấu bị biến thành dấu ?


Xin hỏi các bạn: Dùng cách gì để khắc phục tình trạng này? Tức có thể hiển thị tiếng Việt Unicode trên ComboBox trong mọi lúc
Câu hỏi này tuy là đố vui nhưng ứng dụng thiết thực đây

Trời ơi, quá thiết thực luôn! Em đau đầu nhất là việc này nè! Dùng quá trời phương pháp mà bó tay với nó!
 
Upvote 0
Với ComboBox trên Sheet (hay ActiveX controls nói chung) thì việc hiển thị tiếng Việt Unicode thật sự có vấn đề:
- Khi ta bấm mũi tên xổ xuống của ComboBox, ta nhìn thấy tiếng Việt Unicode hiển thị rất tốt:

View attachment 110999



















- Nhưng ngay khi chọn xong 1 Item rồi click chuột vào đâu đó trên bảng tính thì lập tức những ký tự có dấu bị biến thành dấu ?

View attachment 111000


















Xin hỏi các bạn: Dùng cách gì để khắc phục tình trạng này? Tức có thể hiển thị tiếng Việt Unicode trên ComboBox trong mọi lúc
Câu hỏi này tuy là đố vui nhưng ứng dụng thiết thực đây
Cái này mình dùng 2 cách:
1) dùng kết hợp hàm Univba của thầy quá cố Phạm Duy Long
2) thiết lập ngôn ngữ hệ thống thành là Việt Nam " cái này là tình cờ phát hiện, nhưng chưa test kỹ lấm"
 
Upvote 0
Cái này mình dùng 2 cách:
1) dùng kết hợp hàm Univba của thầy quá cố Phạm Duy Long
2) thiết lập ngôn ngữ hệ thống thành là Việt Nam " cái này là tình cờ phát hiện, nhưng chưa test kỹ lấm"
Bạn làm thử 1 cái gửi lên đây xem. Nhưng nói trước: Cái vụ "thiết lập ngôn ngữ hệ thống thành là Việt Nam" thì thôi.. miễn đi. Bảo đảm chẳng ai muốn làm chuyện này
------------------
Nói thêm rằng: Với bài này tôi thì chẳng cần làm nhiều đến thế, chỉ cần một chút kỹ xảo là xong!
Ẹc... Ẹc...
 
Upvote 0
Bạn làm thử 1 cái gửi lên đây xem. Nhưng nói trước: Cái vụ "thiết lập ngôn ngữ hệ thống thành là Việt Nam" thì thôi.. miễn đi. Bảo đảm chẳng ai muốn làm chuyện này
------------------
Nói thêm rằng: Với bài này tôi thì chẳng cần làm nhiều đến thế, chỉ cần một chút kỹ xảo là xong!
Ẹc... Ẹc...
Sau khi nó không được focus nữa thì nó chịu tác động bởi 2 thuộc tính Text và Value nên nó cứ mã hóa các chữ có dấu tiếng Việt thành dấu chấm hỏi (?) cả! Không biết làm sao để can thiệp vào chúng bây giờ!
 
Upvote 0
Bạn làm thử 1 cái gửi lên đây xem. Nhưng nói trước: Cái vụ "thiết lập ngôn ngữ hệ thống thành là Việt Nam" thì thôi.. miễn đi. Bảo đảm chẳng ai muốn làm chuyện này
------------------
Nói thêm rằng: Với bài này tôi thì chẳng cần làm nhiều đến thế, chỉ cần một chút kỹ xảo là xong!
Ẹc... Ẹc...

cái này là thay đổi ngôn ngữ trong hệ thống :
[video=youtube;gCuCfreqZ1g]http://www.youtube.com/watch?v=gCuCfreqZ1g&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Tôi không bao giờ chơi chiêu thay đổi ngôn ngữ, vì chẳng ai thích làm vậy bao giờ
Thêm nữa: Theo như trong video clip thì tôi thấy hình như bạn đang thí nghiệm với Dropdown chứ không phải ComboBox
(ComboBox là ActiveX Controls nha, còn cái của bạn là Dropdown thuộc Forms)
Trong Video đúng là đối tượng ComboBox của Form Controls, mà nếu sử dụng cái này thì cần quái gì phải thay đổi ngôn ngữ hệ thống, cứ để mặc định của Windows cũng dùng được vậy.
 
Upvote 0
Web KT

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

Back
Top Bottom