Đố 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
 
Xin được võ vẽ thêm đôi câu cùng Nghĩa!
Ví dụ mình sửa lại một tí đoạn test của Nghĩa để thí nghiệm vụ Implicit và Explicit...
[GPECODE=vb]Sub testJoin() 'Tat ca bien kieu Numeric deu bi loi:
Dim i As Long
Dim Arr1() As Date ' Integer, Byte, Double, Currency, Date v.v...
Dim Arr() As Variant
ReDim Arr1(9)
ReDim Arr(9)
For i = 0 To 9
Arr1(i) = i
Arr(i) = Arr1(i)
Next
Debug.Print Join(Arr, ",")
End Sub[/GPECODE]

1) Tôi đã xem đường dẫn đó, vẫn không nói kiểu dữ liệu của mảng 1 chiều là kiểu dữ liệu nào.

2) Trong Exceptions cũng chỉ đề cập đến lỗi là không phải mảng 1 chiều

3) Với Sub TestJoin thì như bài trả lời câu đố đã nói:

Mã:
[COLOR=#ff0000]Các kiểu khai báo mảng thuộc kiểu String, Variant, hoặc không khai báo loại nào [B]đều không phát sinh lỗi[/B][/COLOR]

Thì:

Mã:
Debug.Print Join(Arr, ",")

Với Arr cũng là một mảng không khai báo kiểu dữ liệu, bởi:

Mã:
ReDim Arr(9)

Vì thế làm sao phát sinh được lỗi???

Nguyên tắc ReDim thực chất là tạo ra một mảng mới (nhưng vẫn giữ kiểu dữ liệu ban đầu), cho nên với mảng 1 chiều mà không khai báo gì ở ban đầu, hoặc khai báo kiểu chuỗi, kiểu variant thì không làm ảnh hưởng đến hàm Join.

Mà bạn làm lòng vòng chi vậy, làm như vầy là cũng test được mà:

Mã:
Sub TestDate()
    Dim Arr(2)
    Dim d As [COLOR=#ff0000]Date[/COLOR]
    For d = 0 To 2
        Arr(d) = d
    Next
    Debug.Print Join(Arr, ",")
    
    ''Hoac:

    Arr(0) = #1/1/2013#
    Arr(1) = #1/2/2013#
    Arr(2) = #1/3/2013#
    Debug.Print Join(Arr, ",")
End Sub

XIN LƯU Ý CHO CÂU ĐỐ NÀY: CẤU TRÚC JOIN KHÔNG SAI VÌ TA DÙNG MẢNG 1 CHIỀU, NÓ CŨNG KHÔNG "KÉN" KIỂU DỮ LIỆU CỦA CÁC PHẦN TỬ BÊN TRONG MẢNG, NÓ CHỈ BỊ LỖI ĐỐI VỚI KIỂU DỮ LIỆU CỦA MẢNG LÀ KIỂU NUMERIC MÀ THÔI!
 
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa xem cái này nhé As { Object | String }

[GPECODE=vb]Function Join(
ByVal SourceArray() As { Object | String },
Optional ByVal Delimiter As String = " "
) As String[/GPECODE]

Nói khác hơn nó đòi hỏi kiểu dữ liệu đầu vào phải là như vậy - khi viết hướng dẫn hàm, họ sẽ không nói quá dài được, phần remark thì nó định nghĩa như thế rồi (Required. One-dimensional array containing substrings to be joined). Tạm dịch là: Bắt buộc: Mảng một chiều chứa các chuỗi con cần nối.

Nếu bẻ chữ một chút, điều này có thể coi là (1) Các chuỗi con của một mảng được đặc tả kiểu, tuy nhiên các phần tử của mảng lại được gán với các giá trị là chuỗi, vì vậy trình biên dịch sẽ tự dịch từ chuỗi sang kiểu số liệu của mảng khi thực hiện phép gán; và nếu gán được thì tốt, gán không được nó sẽ báo lỗi. hoặc (2) Muốn các chuỗi con, hay các phần tử của mảng có kiểu số liệu là chuỗi thì mảng đó cũng phải có kiểu số liệu là chuỗi.
Thiết nghĩ điều đó đã rõ ràng rồi mà!

Khi kiểu dữ liệu tham số không được đặc tả hoặc đặc tả dạng không cụ thể (variant chẳng hạn) thì cơ chế biên dịch sẽ tự động dịch sang kiểu dữ liệu cần thiết cho hàm xử lý (Implicit Conversion).
Nhưng nếu đã đặc tả kiểu (số, ngày, giờ ...vv) thì cơ chế chuyển kiểu dữ liệu sẽ không được thực hiện và nó sẽ đưa nguyên số liệu đầu vào theo cách ban đầu Nghĩa đã đặc tả. Và như vậy sẽ gây lỗi số 5 (sai cấu trúc).

Còn trong ví dụ của mình, việc redim chỉ là nghịch ngợm tí thôi - cái quan trọng là lệnh gán từ kiểu số sang mảng không định nghĩa kiểu dữ liệu ý. Cái đó nó sẽ bảo trình dịch tiếp tục thực hiện việc chuyển đổi kiểu số liệu thụ động để đưa đúng món ăn vào cho hàm Join.
Xin võ vẽ thế!
 
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa xem cái này nhé As { Object | String }

[GPECODE=vb]Function Join(
ByVal SourceArray() As { Object | String },
Optional ByVal Delimiter As String = " "
) As String[/GPECODE]

Nói khác hơn nó đòi hỏi kiểu dữ liệu đầu vào phải là như vậy - khi viết hướng dẫn hàm họ sẽ không nói quá dài được, phần remark thì nó định nghĩa như thế rồi (Required. One-dimensional array containing substrings to be joined.).

Khi kiểu dữ liệu tham số không được đặc tả hoặc đặc tả dạng không cụ thể (variant chẳng hạn) thì cơ chế biên dịch sẽ tự động dịch sang kiểu dữ liệu cần thiết cho hàm xử lý (Implicit Conversion).
Nhưng nếu đã đặc tả kiểu (số, ngày, giờ ...vv) thì cơ chế chuyển kiểu dữ liệu sẽ không được thực hiện và nó sẽ đưa nguyên số liệu đầu vào theo cách ban đầu Nghĩa đã đặc tả. Và như vậy sẽ gây lỗi số 5 (sai cấu trúc).

Còn trong ví dụ của mình, việc redim chỉ là nghịch ngợm tí thôi - cái quan trọng là lệnh gán từ kiểu số sang mảng không định nghĩa kiểu dữ liệu ý. Cái đó nó sẽ bảo trình dịch tiếp tục thực hiện việc chuyển đổi kiểu số liệu thụ động để đưa đúng món ăn vào cho hàm Join.
Xin võ vẽ thế!

Câu đó tôi đã nói rõ rồi mà!

Yêu cầu là một mảng 1 chiều:

Em vẫn chưa tâm phục vì sự trả lời này, bởi vì:

Câu màu đỏ, được hiểu rằng:

1) Các chuổi (con) được chứa trong một mảng

hoặc:

2) Một mảng chứa các chuỗi (con)

Chứ không nói KIỂU DỮ LIỆU CỦA MỘT MẢNG!

Câu nào nói về kiểu dữ liệu của mảng đâu? Và câu này:

(Required. One-dimensional array containing substrings to be joined.).

Dịch ra là MẢNG CÓ KIỂU DỮ LIỆU LÀ CHUỖI hay sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Nghĩa ơi, cái SourceArray() As{ Object| String} mà còn không thể hiện kiểu SourceArray là String à! Cú pháp viết tham số hàm đây thôi!

Thông thường phần giải thích thêm chỉ giúp ta hiểu thêm một chút thôi còn cái gì đã quy định trong cú pháp thì cứ y thế mà làm. Có chăng phần giải thích thêm của bác Bill nên thêm mấy chữ. Mảng chứa các phần tử cần nối phải là mảng một chiều có kiểu dữ liệu là chuỗi (One-dimensional array of string data-type containing string elements to be joined).

Ví dụ: ByVal XX() as Long hoặc ByVal YY() as String thì ta nên hiểu thế nào?
Bài viết 942 mình có viết thêm mấy chữ nữa trong lúc bạn đang viết bài!
 
Lần chỉnh sửa cuối:
Upvote 0
Nhưng nói "túm lại" là câu đố đơn giản nhưng không có người trả lời được! hehehehe.--=0

Tôi không nói về mình, nhưng theo tôi nghĩ thì có nhiều người trên GPE có thể trả lời câu hỏi của bạn. Chỉ có điều có thể người ta không quan tâm, người ta không đọc chủ đề của bạn hoặc đơn giản người ta chưa truy cập GPE. Mà tham gia trả lời có phải nghĩa vụ đâu.

Nhưng nếu cái bạn viết trên làm cho bạn thấy vui hơn thì là tốt rồi.
 
Upvote 0
Nghĩa ơi, cái SourceArray() As{ Object| String} mà còn không thể hiện kiểu SourceArray là String à! Cú pháp viết tham số hàm đây thôi!

Thông thường phần giải thích thêm chỉ giúp ta hiểu thêm một chút thôi còn cái gì đã quy định trong cú pháp thì cứ y thế mà làm. Có chăng phần giải thích thêm của bác Bill nên thêm mấy chữ. Mảng chứa các phần tử cần nối phải là mảng một chiều có kiểu dữ liệu là chuỗi (One-dimensional array of string data-type containing string elements to be joined).

Ví dụ: ByVal XX() as Long hoặc ByVal YY() as String thì ta nên hiểu thế nào?
Bài viết 942 mình có viết thêm mấy chữ nữa trong lúc bạn đang viết bài!

Cũng như ListBox ta chỉ được tạo 10 cột, nhưng với tiểu xảo ta vẫn tạo số cột nhiều hơn.

Hàm JOIN này cũng vậy, nếu ta khai báo rõ ràng, tường mình thì đôi khi lại gặp lỗi, nhưng ngược lại, nếu ta không tường minh thì lại chạy hiệu quả (mặc dù bên trong toàn dữ liệu kiểu numeric).

Nói vậy cho mọi người hiểu rằng đôi khi ta vẫn "lách luật" trong VBA được là vậy.

Mục đích đố chỉ là vậy thôi.
 
Upvote 0
Cũng như ListBox ta chỉ được tạo 10 cột, nhưng với tiểu xảo ta vẫn tạo số cột nhiều hơn.

Hàm JOIN này cũng vậy, nếu ta khai báo rõ ràng, tường mình thì đôi khi lại gặp lỗi, nhưng ngược lại, nếu ta không tường minh thì lại chạy hiệu quả (mặc dù bên trong toàn dữ liệu kiểu numeric).

Nói vậy cho mọi người hiểu rằng đôi khi ta vẫn "lách luật" trong VBA được là vậy.

Mục đích đố chỉ là vậy thôi.
cái này bac "siwtom" đã nói rõ ở bài trên rồi
đồng thời Ông Bill cũng đã định nghĩa rõ ràng hàm Join là làm nối các chuỗi trong mảng thành 1 chuỗi
vậy theo Anh ý nó là gì????
theo mình hiểu câu ấy là Join sẽ nối các chuỗi ký tự lại với nhau, nhưng các số vẫn có thể nối với nhau bởi vì Ông Bill hiểu các số ấy ko phải là các "con số "mà là "chữ số " (là chuỗi)
còn khi anh khai báo biến là biến số thì anh đang ép Ông Bill hiểu đây là những con số nên Ông Bill phản lại : đây ko phải công việc của tôi, tôi ko cố nghĩa vụ phải làm, nên việc này tao ko làm ------> dẫn đến báo lỗi thế thôi

đùa chút thôi theo mình nghĩ quan điểm của Ông Bill là các con số thì phải dùng trong tính toán chứ ko phải dùng để nối nên việc nối chỉ cho phép thực hiện ở chế độ chuỗi
 
Lần chỉnh sửa cuối:
Upvote 0
cái này bac "siwtom" đã nói rõ ở bài trên rồi
đồng thời Ông Bill cũng đã định nghĩa rõ ràng hàm Join là làm nối các chuỗi trong mảng thành 1 chuỗi
vậy theo Anh ý nó là gì????
theo mình hiểu câu ấy là Join sẽ nối các chuỗi ký tự lại với nhau, nhưng các số vẫn có thể nối với nhau bởi vì Ông Bill hiểu các số ấy ko phải là các "con số "mà là "chữ số " (là chuỗi)
còn khi anh khai báo biến là biến số thì anh đang ép Ông Bill hiểu đây là những con số nên Ông Bill phản lại : đây ko phải công việc của tôi, tôi ko cố nghĩa vụ phải làm, nên việc này tao ko làm ------> dẫn đến báo lỗi thế thôi

đùa chút thôi theo mình nghĩ quan điểm của Ông Bill là các con số thì phải dùng trong tính toán chứ ko phải dùng để nối nên việc nối chỉ cho phép thực hiện ở chế độ chuỗi


Gọi là tổng kết lại những thông tin căn bản.
Theo tôi hiểu thì:

1. JOIN đòi hỏi mảng vào là mảng các chuỗi.
2. Nếu ta truyền mảng các chuỗi thì JOIN nói: dạ vâng, em bắt tay vào việc đây. Nếu ta truyền mảng các số thì JOIN nói: Tôi không làm vì người ta không đếm xỉa tới yêu cầu của tôi.

Nhưng có ai đó nói: Thế tại sao với code

Mã:
Sub Test()
    Dim i As Byte
    Dim Arr(0 To 9)
    For i = 0 To 9
        Arr(i) = i
    Next
    MsgBox TypeName(Arr(1))
    MsgBox Join(Arr, ",")
End Sub

thì hàm JOIN vẫn "xơi" tuốt luốt, không bị "mắc xương"? MsgBox chả đã nói rõ là mảng đang chứa các giá trị BYTE là gì? BYTE đâu có là STRING?

Nguyên nhân thì tôi đã nói ở bài #935: Mà đã là VARIANT thì dù nhập vào SỐ thì nó luôn được "nhìn" là SỐ hoặc CHUỖI tùy theo "nhu cầu" hiện hành ***

Dùng Variant nó có cái khác ở chỗ đó. Tức "ta" cung cấp cho JOIN mảng chuỗi.

Về *** mà tôi viết là có cơ sở hẳn hoi

Variant Data Type

The Variant data type is the data type for all variables that are not explicitly declared as some other type (using statements such as Dim, Private, Public, or Static). The Variant data type has no type-declaration character.

A Variant is a special data type that can contain any kind of data except fixed-length String data. (Variant types now support user-defined types.) A Variant can also contain the special values Empty, Error, Nothing, and Null. You can determine how the data in a Variant is treated using the VarType function or TypeName function.

Numeric data can be any integer or real number value ranging from -1.797693134862315E308 to -4.94066E-324 for negative values and from 4.94066E-324 to 1.797693134862315E308 for positive values. Generally, numeric Variant data is maintained in its original data type within the Variant. For example, if you assign an Integer to a Variant, subsequent operations treat the Variant as an Integer. However, if an arithmetic operation is performed on a Variant containing a Byte, an Integer, a Long, or a Single, and the result exceeds the normal range for the original data type, the result is promoted within the Variant to the next larger data type. A Byte is promoted to an Integer, an Integer is promoted to a Long, and a Long and a Single are promoted to a Double. An error occurs when Variant variables containing Currency, Decimal, and Double values exceed their respective ranges.

You can use the Variant data type in place of any data type to work with data in a more flexible way. If the contents of a Variant variable are digits, they may be either the string representation of the digits or their actual value, depending on the context. For example:

Dim MyVar As Variant
MyVar = 98052


In the preceding example,

MyVar

contains a numeric representation — the actual value
98052

. Arithmetic operators work as expected on Variant variables that contain numeric values or string data that can be interpreted as numbers. If you use the + operator to add
MyVar

to another Variant containing a number or to a variable of a numeric type, the result is an arithmetic sum.

The value Empty denotes a Variant variable that hasn't been initialized (assigned an initial value). A Variant containing Empty is 0 if it is used in a numeric context and a zero-length string ("") if it is used in a string context.

Don't confuse Empty with Null.Null indicates that the Variant variable intentionally contains no valid data.

In a Variant, Error is a special value used to indicate that an error condition has occurred in a procedure. However, unlike for other kinds of errors, normal application-level error handling does not occur. This allows you, or the application itself, to take some alternative action based on the error value. Error values are created by converting real numbers to error values using the CVErr function.

Chỗ đỏ đỏ chính là cái tôi đã viết.

Vậy thì:

1. nếu đòi hỏi phải có mảng các SỐ mà ta truyền mảng Variant mà hiện thời đang chứa các SỐ thì dĩ nhiên là tốt rồi. Nhưng ta cũng có thể truyền mảng các CHUỖI mà mỗi chuỗi có thể convert được thành SỐ (vd. "12" convert được thành SỐ nhưng "hichic" thì không convert được thành SỐ). Cơ sở là cái dòng đỏ đỏ kia.

2. nếu đòi hỏi phải có mảng các CHUỖI mà ta truyền mảng Variant mà hiện thời đang chứa các CHUỖI thì dĩ nhiên là tốt rồi. Nhưng ta cũng có thể truyền mảng các SỐ. Cơ sở là cái dòng đỏ đỏ kia.

3. Dù là Variant "12" hay Variant 12 nếu dùng trong biểu thức có phép "+" thì nó có vai trò là SỐ 12, nếu dùng trong ghép chuỗi thì nó có vai trò là chuỗi "12".

Ta phải ý thức được:

1. Variant nó có gì khác biệt với các kiểu dữ liệu khác.

2. Cái ta nhìn thấy, có được, sờ nắn ngửi được là kết quả của bao thao tác mà ta không nhìn thấy, kể cả convert nếu cần thiết, là kết quả mà bao "vị" đã đổ mồ hôi âm thầm cần cù làm sau "cánh gà" để có được "sản phẩm" dâng cho ta. JOIN không phải tự convert SỐ thành chuỗi, mà nó dứt khoát không làm, mà nó được cung cấp mảng chuỗi là sản phẩm mà "trước đó" sau "cánh gà" "người ta" đã đổ mồ hôi để tạo ra để dâng cho nó.
----------------
Đó là những gì tôi hiểu. Tôi không dám nói là mình hiểu đúng. Nhưng những gì tôi muốn viết thì đã viết hết rồi. Vậy đây là bài cuối cùng của tôi về vấn đề này.
 
Upvote 0
Gọi là tổng kết lại những thông tin căn bản.
Theo tôi hiểu thì:

1. JOIN đòi hỏi mảng vào là mảng các chuỗi.
2. Nếu ta truyền mảng các chuỗi thì JOIN nói: dạ vâng, em bắt tay vào việc đây. Nếu ta truyền mảng các số thì JOIN nói: Tôi không làm vì người ta không đếm xỉa tới yêu cầu của tôi.

Nhưng có ai đó nói: Thế tại sao với code


[GPECODE=vb]Sub Test()
Dim i As Byte
Dim Arr(0 To 9)
For i = 0 To 9
Arr(i) = i
Next
MsgBox TypeName(Arr(1))
MsgBox Join(Arr, ",")
End Sub[/GPECODE]


thì hàm JOIN vẫn "xơi" tuốt luốt, không bị "mắc xương"? MsgBox chả đã nói rõ là mảng đang chứa các giá trị BYTE là gì? BYTE đâu có là STRING?
đương nhiên đoạn code trên chạy tốt rồi, vì như Bác đã nói "đỏ đỏ" đó đã được chấp thuận, nên em nó phải làm việc thôi, vì khi ko khai báo mảng Arr thuôc loại nào mặt nhiên nó là variant , tuy biến i đc khai báo nhưng mảng vẫn là variant
Nhưng có ai đó nói: Thế tại sao với code
vậy cảm phiềm test thêm 2 đoạn code này
[GPECODE=vb]Sub Test()
Dim i As Byte
Dim Arr(1 To 9) as Byte
For i = 1 To 9
Arr(i) = i
Next
MsgBox TypeName(Arr(1))
MsgBox Join(Arr, ",")
End Sub[/GPECODE]
ta thiết lập mạng là kiểu byte Dim Arr(1 To 9) as Byte
và đoạn này [GPECODE=vb]Sub Test()
Dim i As Byte
Dim Arr(1 To 9)
For i = 1 To 9
Arr(i) = i
Next
MsgBox TypeName(Arr)
MsgBox Join(Arr, ",")
End Sub[/GPECODE]

MsgBox TypeName(Arr)
Join đang làm việc với mảng nên mình cần xem mảng đó là mảng kiểu gì mà thôi
 
Lần chỉnh sửa cuối:
Upvote 0
- Vẽ cái Frame
- Click chuột phải vào đó, chọn Frame Object --> Edit
- Tự nhiên sẽ thấy và.. biết liền
Thầy ơi, khi em xài cái Frame này ở WinXP, Excel 2003 thì khi mở file nó hiện thông báo như thế này (xem hình), chọn Yes thì nó cho sử dụng, No thì như cái shape vậy đó. Cho em hỏi cách khắc phục đừng cho nó hiện thông báo này mỗi lần mở thì như thế nào ạ?

Nội dung:

This condition is related to how ActiveX controls are initialized within Office applications. ActiveX controls are programs and can store data in either the registry or within the control itself. ActiveX controls are similar to Visual Basic for Applications macros except they are compiled to a special file type and can be linked to a data file that can support them (for instance, Word documents and Excel workbooks). When you receive a file with an ActiveX control linked to it, the possibility that there may be "persistent" data (data stored with the control) is unknown; the data could be malicious - used to plant a virus or to modify your computer with the intent to do harm. Office applications provide, by default, the ability to block ActiveX controls from using persisted data. However, if you have specifically changed the default setting for ActiveX initialization during the installation process, or by using a policy, the system will perform the initialization of the ActiveX control based on your custom settings.If you choose to allow the application to run the control and to allow it to use persisted data, you do so at your own risk. It is highly recommended to not run ActiveX controls in documents submitted to you by people you do not know. However, if you trust the source of the document and the individual or company who sent it to you, then you can load the control and allow it to use persisted data. However, this is no guarantee that the data associated with the control is actually safe to use.
There are limitations to the ability of Office applications to migrate ActiveX control link references from one format of a document or file to another format. For instance, you can link an ActiveX control to a Word document and save that file. However, when you convert that Word document to another format the link reference to the ActiveX control might not convert into that file format. Therefore, conversion of files that have links to ActiveX controls may not be supported for all file types, partly because not all file types can support ActiveX control linking or activation. For files with links to ActiveX controls, it is necessary to accept and activate the ActiveX control prior to converting the file to another file type that supports ActiveX linking and activation. If the ActiveX control is not activated, the link reference is dropped from the file and will not appear in the converted file.
More information about this error message online.
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    142.2 KB · Đọc: 47
Lần chỉnh sửa cuối:
Upvote 0
Thầy ơi, khi em xài cái Frame này ở WinXP, Excel 2003 thì khi mở file nó hiện thông báo như thế này (xem hình), chọn Yes thì nó cho sử dụng, No thì như cái shape vậy đó. Cho em hỏi cách khắc phục đừng cho nó hiện thông báo này mỗi lần mở thì như thế nào ạ?

Lang thang trên Google, mãi mới tìm được cách "khống chế", cũng để cho nó hoạt động mà không thông báo, chứ cách này liên quan đến an toàn (http://support.microsoft.com)

Làm theo các bước sau:

1) Bấm start, bấm run, gõ regedit, và sau đó bấm OK.

2) Mở rộng khoá con registry sau:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Common

3) Bấm chuột phải vào Common, chọn New và sau đó bấm Key.

4) Gõ Security, rồi nhấn ENTER để đặt tên mới.

5) Bấm chuột phải vào Security, chọn New, và sau đó bấm Giá trị DWORD.

6) Gõ UFIControls, và sau đó nhấn ENTER để đặt tên giá trị.

7) Bấm đúp vào UFIControls.

8) Trong ô dữ liệu giá trị , nhập 1, và sau đó bấm OK.

Chú ý Cài đặt khả dụng cho UFIControls 1 đến 6. Thiết đặt an toàn nhất là 4. Thiết lập mặc định là 6 và thiết lập kém an toàn nhất là 1.

9) Thoát khỏi Registry Editor.
 
Upvote 0
Thiết lập như thế này thật tình là không được nếu ta dùng sự kiện Workbook_Open và trên file đó chứa ActiveX Controls (cái thông báo nó nhảy ra trước khi sự kiện hoạt động).

Mã:
Sub UFIControlsSetting(ByVal Input_from_1_to_6 As Byte)
    ''Chi nhap tu 1 den 6
    ''Kem an toan nhat: 1
    ''An toan nhat: 4
    Dim regKey As String
    regKey = "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Common\Security\UFIControls"
    CreateObject("WScript.Shell").RegWrite regKey, Input_from_1_to_6, "REG_DWORD"
End Sub

Mã:
Private Sub Workbook_Open()
    UFIControlsSetting 1
End Sub

Vậy phải làm sao đây các Thầy ơi???
 
Upvote 0
Chắc máy của Nghĩa bị làm sao ấy... chứ có ai bị vụ này đâu mà test đây?
Máy em đâu, 5 cái máy xài WinXP và Excel 2003 đều bị dính hết, phải regedit hết mới không còn bị nữa! Còn máy em xài Win7 Excel 2010 nên không bị.
 
Upvote 0
Upvote 0
Hôm nay mình muốn đưa ra 1 câu đố vui, mong anh em cùng thử 1 chút:

Trên Form UserForms1 chỉ có 1 Button là CommandButton1. Không thêm bất kể 1 đối tượng nào trên Form và không dùng hình nền cho Form làm sao có thể khi nhấn Button sẽ xuất hiện dòng chữ WELLCOME lên trên Form khi RunTime
 
Upvote 0
Hôm nay mình muốn đưa ra 1 câu đố vui, mong anh em cùng thử 1 chút:

Trên Form UserForms1 chỉ có 1 Button là CommandButton1. Không thêm bất kể 1 đối tượng nào trên Form và không dùng hình nền cho Form làm sao có thể khi nhấn Button sẽ xuất hiện dòng chữ WELLCOME lên trên Form khi RunTime

Có phải giống như bên dưới ở VB6.0 không anh?

[video=youtube;aFnZVRXxEeo]http://www.youtube.com/watch?v=aFnZVRXxEeo&feature=youtu.be[/video]
 
Upvote 0
Cái này chỉ hữu dụng đối với MDI form chứ VBA đâu có được, mình cũng đã Test lại cho chắc chắn rồi.

Nó như hình trong file sau
 

File đính kèm

  • Vi du.doc
    29 KB · Đọc: 17
Lần chỉnh sửa cuối:
Upvote 0
Hôm nay mình muốn đưa ra 1 câu đố vui, mong anh em cùng thử 1 chút:

Trên Form UserForms1 chỉ có 1 Button là CommandButton1. Không thêm bất kể 1 đối tượng nào trên Form và không dùng hình nền cho Form làm sao có thể khi nhấn Button sẽ xuất hiện dòng chữ WELLCOME lên trên Form khi RunTime

Bài này nếu dùng API thì không có vấn đề gì cả (cho hiển thị Text lên bất cứ đâu cũng được)
Vấn đề là do đang ĐỐ VUI nên không biết anh sealand có mẹo gì không?
Nếu anh sealand khẳng định loại trừ cách dùng hàm API thì quả thật mình chưa nghĩ ra được cách gì khác
 
Upvote 0
Web KT

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

Back
Top Bottom