Đố vui về VBA! (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
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
 
Upvote 0
Bài #1001 (con chó đốm) đó anh.
Uh, nói chung cách nào cũng ra kết quả tốt đẹp!

Nếu ta chọn Goto thì Ô được chọn sẽ Active, còn dùng scroll thì ô đang active ở đâu thì ở luôn ở đó. Tùy trường hợp mà dùng vậy!

Coi trong Help nó có nhiều cái thú vị lắm, lâu lâu thấy gì lạ lôi ra đố tiếp kakakaka.
 
Lần chỉnh sửa cuối:
Upvote 0
Uh, nói chung cách nào cũng ra kết quả tốt đẹp!

Nếu ta chọn Goto thì Ô được chọn sẽ Active, còn dùng scroll thì ô đang active ở đâu thì ở luôn ở đó. Tùy trường hợp mà dùng vậy!

Vì vậy em mới nói chứ đâu tự nhiên mà em nói vậy, có những câu hỏi chỉ có 1 đáp án nhưng có thể có những câu hỏi có nhiều đáp án khác nhau nhưng sẽ cho kết quả tương tự.
 
Upvote 0
Với 1 dòng code duy nhất không dùng dấu : để tách code vậy tôi muốn gán từ VBA, Giải, Pháp, Excel vào vùng A1:B2 vậy với đoạn code nào để làm việc này nhanh nhất (tức là 1 mỗi ô là 1 từ)
 
Upvote 0
Với 1 dòng code duy nhất không dùng dấu : để tách code vậy tôi muốn gán từ VBA, Giải, Pháp, Excel vào vùng A1:B2 vậy với đoạn code nào để làm việc này nhanh nhất (tức là 1 mỗi ô là 1 từ)
Có phải vầy không bạn
Mã:
    [A1:B2].FormulaArray = "={""VBA"",""Gi" & ChrW(7843) & "i"";""Pháp"",""Excel""}"
 
Upvote 0
Em đoán mò vậy: có phải phụ thuộc dấu phân cách trong công thức mảng theo từng máy không thầy?

Lúc đầu tôi nghĩ vậy nhưng sau đó test lại thì thấy không phải. Code VBA nó tự nhiên "hiểu" tuốt
Coi như đáp án này tạm chấp nhận đi, có điều theo suy nghĩ của tôi thì hình như tác giả yêu cầu GÁN GIÁ TRỊ chứ hổng phải GÁN CÔNG THỨC
 
Upvote 0
Với 1 dòng code duy nhất không dùng dấu : để tách code vậy tôi muốn gán từ VBA, Giải, Pháp, Excel vào vùng A1:B2 vậy với đoạn code nào để làm việc này nhanh nhất (tức là 1 mỗi ô là 1 từ)

Nếu là không quan tâm tiếng việt có dấu thì dùng đơn giản thế này

[GPECODE=vb][A1:B2] = [{"VBA","Giai";"Pháp","Excel"}][/GPECODE]

Còn thích có dấu thì thế này
[GPECODE=vb][A1:B2] = Evaluate("{""VBA"",""Gi" & ChrW(7843) & "i"";""Pháp"",""Excel""}")[/GPECODE]
 
Upvote 0
Nếu là không quan tâm tiếng việt có dấu thì dùng đơn giản thế này

[GPECODE=vb][A1:B2] = [{"VBA","Giai";"Pháp","Excel"}][/GPECODE]
Chính xác như thế trong đây mình chỉ muốn nhấn mạnh để hàm Evaluate để dùng khi gán trị vùng có nhiều hơn 1 hàng khi đó dùng hàm Array sẽ không làm được việc này. Với cách này chúng ta có thể gán tiêu đề, nhãn cho vùng nhanh nhất (có thế tốc độ chậm vì nó vẫn là 1 hàm). Thích hợp với tiếng Anh và tiếng Việt không dấu nếu có dấu thì dài hơn cũng là cách 2 của bạn Vodox đã đưa. Thanks
 
Upvote 0
Chính xác như thế trong đây mình chỉ muốn nhấn mạnh để hàm Evaluate để dùng khi gán trị vùng có nhiều hơn 1 hàng khi đó dùng hàm Array sẽ không làm được việc này

Cái đó chưa chắc nha! Ít nhất tôi biết có 1 cách không dùng Evaluate, chỉ dùng Array bình thường cũng có thể làm được bài này đấy
 
Upvote 0
Cái đó chưa chắc nha! Ít nhất tôi biết có 1 cách không dùng Evaluate, chỉ dùng Array bình thường cũng có thể làm được bài này đấy
Thêm cách củ chuối sau, nó quá dài Thầy à.
Mã:
Range("A1:B2") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Array(Array("VBA", "Giai"), Array("Pháp", "Excel"))))
 
Upvote 0
Thêm cách củ chuối sau, nó quá dài Thầy à.
Mã:
Range("A1:B2") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Array(Array("VBA", "Giai"), Array("Pháp", "Excel"))))

Ủa! 1 cái Transpose là được rồi mà:
Mã:
Range("A1:B2") = WorksheetFunction.Transpose(Array(Array("VBA", "Pháp"), Array("Giai", "Excel")))
----------------------
Em rút gọn lại như sau:
Range("A1:B2") = WorksheetFunction.Transpose([{"VBA", "Giai";"Pháp", "Excel"}])
Cái này là... Evaluate mà... Và nếu Evaluate thì cần gì đến Transpose?
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm nay mình có đề tài này vừa là câu đố vừa là cái mình đang không thể làm nên đưa ra xem coi anh chị nào có phương pháp hay không.
Bài toán là mình có 10 000 cột cần ẩn đi, ẩn 1 cột cách 1 cột. Yêu cầu là nạp địa chỉ vào mảng để ẩn cho nhanh. Điều kiện ràng buộc là chỉ 1 vòng lặp duy nhất.
 
Upvote 0
Hôm nay mình có đề tài này vừa là câu đố vừa là cái mình đang không thể làm nên đưa ra xem coi anh chị nào có phương pháp hay không.
Bài toán là mình có 10 000 cột cần ẩn đi, ẩn 1 cột cách 1 cột. Yêu cầu là nạp địa chỉ vào mảng để ẩn cho nhanh. Điều kiện ràng buộc là chỉ 1 vòng lặp duy nhất.

Hôm trước có nghe Hải nhắc vụ này và mình đề xuất dùng Union chứ không chơi địa chỉ dạng text
Kiểu vầy nè:
Mã:
Sub Test()
  Dim n As Long, rng As Range
  For n = 1 To 1000 Step 2
    If rng Is Nothing Then
      Set rng = Cells(1, n)
    Else
      Set rng = Union(rng, Cells(1, n))
    End If
  Next
  rng.EntireColumn.Hidden = True
End Sub
 
Upvote 0
Hôm trước có nghe Hải nhắc vụ này và mình đề xuất dùng Union chứ không chơi địa chỉ dạng text
Kiểu vầy nè:
Mã:
Sub Test()
  Dim n As Long, rng As Range
  For n = 1 To 1000 Step 2
    If rng Is Nothing Then
      Set rng = Cells(1, n)
    Else
      Set rng = Union(rng, Cells(1, n))
    End If
  Next
  rng.EntireColumn.Hidden = True
End Sub
Em cũng nghĩ phải xử cách này, chứ ngẫm nghĩ kỹ thì không dùng cách kia được. Không phải range có ít đối số mà là chuỗi string chỉ cho phép có 255 ký tự thì phải
Khi mình join cái mảng lại thì số ký tự vượt quá mức cho phép thì phải.

..............

Vừa kiểm tra xong, nếu 1000 thì chạy được nhưng với 10 000 thì đi pha cafe uống xong rồi khởi động lại Excel anh à.
 
Lần chỉnh sửa cuối:
Upvote 0
Vừa kiểm tra xong, nếu 1000 thì chạy được nhưng với 10 000 thì đi pha cafe uống xong rồi khởi động lại Excel anh à.

Thí nghiệm chơi thế thôi chứ liệu trên thực tế có ai đi ẩn 10.000 cột đâu ta?
Làm việc trên Range đương nhiên tốc độ chậm thôi
 
Upvote 0
Em cũng nghĩ phải xử cách này, chứ ngẫm nghĩ kỹ thì không dùng cách kia được. Không phải range có ít đối số mà là chuỗi string chỉ cho phép có 255 ký tự thì phải
Khi mình join cái mảng lại thì số ký tự vượt quá mức cho phép thì phải.
..............
Vừa kiểm tra xong, nếu 1000 thì chạy được nhưng với 10 000 thì đi pha cafe uống xong rồi khởi động lại Excel anh à.
Híc, tui hông biết
...chuỗi string chỉ cho phép có 255 ký tự thì phải...
nhưng nếu:
Bài toán là mình có 10 000 cột cần ẩn đi, ẩn 1 cột cách 1 cột. Yêu cầu là nạp địa chỉ vào mảng để ẩn cho nhanh. Điều kiện ràng buộc là chỉ 1 vòng lặp duy nhất.
thì tui cứ cho một biến chạy cà tưng 2 bước, nạp địa chỉ muốn ẩn vào một biến khác, cứ chừng vài cột (cứ khi nào code cự nự) thì tui.......ẩn mấy cột đó, sau đó tui......nhảy cà tưng tiếp rồi lại....ẩn tiếp
Thử 1000 cột, chưa kịp bấm F5 nó đã ẩn xong (nói dóc thôi)
Thử gần "mắc-xi-mum" cột (16380) thì máy nó.......rùng mình một cái là xong dù máy tui là máy "xi-ma-chao"
Hihi, vẫn thỏa yêu cầu chạy một vòng lặp, còn nạp vào mảng hay không tui....hông biết
 
Upvote 0
Híc, tui hông biết

nhưng nếu:

thì tui cứ cho một biến chạy cà tưng 2 bước, nạp địa chỉ muốn ẩn vào một biến khác, cứ chừng vài cột (cứ khi nào code cự nự) thì tui.......ẩn mấy cột đó, sau đó tui......nhảy cà tưng tiếp rồi lại....ẩn tiếp
Thử 1000 cột, chưa kịp bấm F5 nó đã ẩn xong (nói dóc thôi)
Thử gần "mắc-xi-mum" cột (16380) thì máy nó.......rùng mình một cái là xong dù máy tui là máy "xi-ma-chao"
Hihi, vẫn thỏa yêu cầu chạy một vòng lặp, còn nạp vào mảng hay không tui....hông biết
Em muốn nạp vào mảng để lấy chuỗi cơ. Hỏng muốn cho xài Union à ngen.
Muốn xem anh code của anh lắm cơ.
 
Upvote 0
Em muốn nạp vào mảng để lấy chuỗi cơ. Hỏng muốn cho xài Union à ngen.
Muốn xem anh code của anh lắm cơ.
Nó đây:
Mã:
Public Sub TenTiTo()
    Dim I, A, K, J
    Application.ScreenUpdating = False
        J = 16380
            For I = 1 To J Step 2
                K = K + 1
                A = A & " " & Columns(I).Address(, 0)
                If K = 25 Or I = J Or J - I = 1 Then
                    A = Replace(Trim(A), " ", ", ")
                    Range([A]).EntireColumn.Hidden = True
                    K = 0: A = ""
                End If
            Next I
    Application.ScreenUpdating = True
End Sub
Mục đích của chú là nhanh thì ....miễn nhanh là ok nhỉ
Híc
 
Upvote 0
Sub abc()
Application.ScreenUpdating = False


Dim Arr_Rng
Dim Rng As Range
ReDim Arr_Rng(1 To 1, 1 To 9000)
Set Rng = Range("A1:XFD100000")
Dim I As Long
Dim Dem As Long
Dem = 0
For I = 1 To 16380
If (I Mod 2 = 0) Then
Dem = Dem + 1
Set Arr_Rng(1, Dem) = Rng(1, I)
End If
Next


For I = 1 To Dem
Arr_Rng(1, I).EntireColumn.Hidden = True
Next I
Application.ScreenUpdating = True
End Sub
góp vui thêm code này xem sao? cái này có gắng vào mảng sau đó lấy phần tử mảng để ẩn đi
 
Upvote 0
Mình lọ mọ thì mần được kiểu này. Nhanh hơn của anh Cò tí tẹo vì có số lần ẩn ít hơn.
PHP:
Sub HideCol()
Dim Tem(), I&, K&
For I = 1 To 16380 Step 2
   K = K + 1
   ReDim Preserve Tem(1 To K)
   Tem(K) = Columns(I).Address(, 0)
   If Len(Join(Tem, ",")) > 240 Or I + 1 = 16380 Then
      Range(Join(Tem, ",")).EntireColumn.Hidden = 1
      K = 0: Erase Tem
   End If
Next
End Sub
 
Upvote 0
Upvote 0
Comment ẩn trên bảng tính?

Có một cái comment ẩn trong file đính kèm dưới đây. Đố các bạn tìm ra được nó
 

File đính kèm

Upvote 0
Cái này em tìm mãi mà không thấy ... Em bó tay

Tìm bằng mắt không ra, ta có thể dùng code để tìm! Chẳng hạn thí nghiệm đoạn ?Activesheet.Comments.Count trong cửa sổ Immediate xem nó ra gì? --=0
(Gợi ý thế thôi chứ ai mà biết gì trong.. trái ổi)
 
Upvote 0
Góp vui chút

Làm sao thêm lệnh vào Menu chuột phải khi xem ở chế độ Page Break
Untitled.jpg
 
Upvote 0
Theo tôi là ở cái đoạn này

Mã:
'Excel 2010
Set ContextMenu = Application.CommandBars([COLOR=#ff0000][B]40[/B][/COLOR])
Không có Excel 2010 nên không biết phải không nhưng có cách nào áp dụng cho tất cả các phiên bản Excel không?
 
Upvote 0
Làm sao thêm lệnh vào Menu chuột phải khi xem ở chế độ Page Break
b1/ Open a new workbook and save it at as a Macro Enabled Workbook (xlsm) and close the workbook.
Open the file in the Custom UI Editor and Insert an Office 2010 Custom UI Part. Add the RibbonX below in the Office 2010 Custom UI Part of the workbook and save it. Close the Custom UI Editor
PHP:
Nguồn: http://www.rondebruin.nl/win/s2/win014.htm

Link tải Custom UI Editor:
http://openxmldeveloper.org/cfs-fil.../00-00-00-02-39/OfficeCustomUIEditorSetup.zip
b2/ Chèn đoạn sau để thêm menu (ở phần Custom UI Editor)
PHP:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenu idMso="ContextMenuCell">
         <button id="MyButton" label="Add a menu..."  '<== Tên menu 
             insertBeforeMso="Cut"  '<== vị trí đặt menu
             onAction="cmd_macro"  '<== Tên macro cần khởi chạy
             imageMso="GoLeftToRight"/>  '<== Biểu tượng cho menu
        <menuSeparator id="MySeparator" insertBeforeMso="Cut" />  '<== dấu phân cách
      </contextMenu>
   </contextMenus>
</customUI>

*Cách khác:
- Tải file đính kèm về. Giải nén được file *.xlsm.
- Đổi đuôi file *.xlsm thành *.zip
- Mở file *.zip bằng 7z / Mục customUI / customUI14.xml / ấn F4 (edit bằng notepad).
- Sửa code theo ý muốn. Save / Close.
- Đổi file *.zip thành *.xlsm. Mở file đó lên rồi vào vba viết macro cho onAction="cmd_macro".

p/s: Các biểu tượng cho menu content
http://soltechs.net/CustomUI/imageMso01.asp?gal=6&count=no
 

File đính kèm

Upvote 0
b1/ Open a new workbook and save it at as a Macro Enabled Workbook (xlsm) and close the workbook.
Open the file in the Custom UI Editor and Insert an Office 2010 Custom UI Part. Add the RibbonX below in the Office 2010 Custom UI Part of the workbook and save it. Close the Custom UI Editor
PHP:
Nguồn: http://www.rondebruin.nl/win/s2/win014.htm

Link tải Custom UI Editor:
http://openxmldeveloper.org/cfs-fil.../00-00-00-02-39/OfficeCustomUIEditorSetup.zip
b2/ Chèn đoạn sau để thêm menu (ở phần Custom UI Editor)
PHP:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenu idMso="ContextMenuCell">
         <button id="MyButton" label="Add a menu..."  '<== Tên menu 
             insertBeforeMso="Cut"  '<== vị trí đặt menu
             onAction="cmd_macro"  '<== Tên macro cần khởi chạy
             imageMso="GoLeftToRight"/>  '<== Biểu tượng cho menu
        <menuSeparator id="MySeparator" insertBeforeMso="Cut" />  '<== dấu phân cách
      </contextMenu>
   </contextMenus>
</customUI>

*Cách khác:
- Tải file đính kèm về. Giải nén được file *.xlsm.
- Đổi đuôi file *.xlsm thành *.zip
- Mở file *.zip bằng 7z / Mục customUI / customUI14.xml / ấn F4 (edit bằng notepad).
- Sửa code theo ý muốn. Save / Close.
- Đổi file *.zip thành *.xlsm. Mở file đó lên rồi vào vba viết macro cho onAction="cmd_macro".

p/s: Các biểu tượng cho menu content
http://soltechs.net/CustomUI/imageMso01.asp?gal=6&count=no
Chưa thử nhưng cái này chắc không xài được cho Excel 2003 rồi.
 
Upvote 0
Chưa thử nhưng cái này chắc không xài được cho Excel 2003 rồi.
All Versions of Microsoft Excel:
1/ Module:
PHP:
Sub Add_menu()
    Dim ContextMenu As CommandBar
    Dim MySubMenu As CommandBarControl
    Call Delete_menu
    Set ContextMenu = Application.CommandBars("Cell")
    With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)
        .OnAction = "cmd_hello"
        .FaceId = 39
        .Caption = "Add a menu..."
        .Tag = "Add_menu"
    End With

End Sub

Sub Delete_menu()
    Dim ContextMenu As CommandBar
    Dim menu As CommandBarControl
    Set ContextMenu = Application.CommandBars("Cell")
    For Each menu In ContextMenu.Controls
        If menu.Tag = "Add_menu" Then
            menu.Delete
        End If
    Next menu
End Sub

Sub cmd_hello()
   mgb = MsgBox("Run a macro.", , "Msg box")
End Sub

2/ ThisWorkbook:
PHP:
Private Sub Workbook_Activate()
    Call Add_menu
End Sub

Private Sub Workbook_Deactivate()
    Call Delete_menu
End Sub

Nguồn:
https://msdn.microsoft.com/en-us/library/office/gg469862(v=office.14).aspx
 
Upvote 0
All Versions of Microsoft Excel:1/ Module:
PHP:
Sub Add_menu()    Dim ContextMenu As CommandBar    Dim MySubMenu As CommandBarControl    Call Delete_menu    Set ContextMenu = Application.CommandBars("Cell")    With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)        .OnAction = "cmd_hello"        .FaceId = 39        .Caption = "Add a menu..."        .Tag = "Add_menu"    End WithEnd SubSub Delete_menu()    Dim ContextMenu As CommandBar    Dim menu As CommandBarControl    Set ContextMenu = Application.CommandBars("Cell")    For Each menu In ContextMenu.Controls        If menu.Tag = "Add_menu" Then            menu.Delete        End If    Next menuEnd SubSub cmd_hello()   mgb = MsgBox("Run a macro.", , "Msg box")End Sub
2/ ThisWorkbook:
PHP:
Private Sub Workbook_Activate()    Call Add_menuEnd SubPrivate Sub Workbook_Deactivate()    Call Delete_menuEnd Sub
Nguồn:https://msdn.microsoft.com/en-us/library/office/gg469862(v=office.14).aspx
Đọc kỹ lại câu đố nha bạn.
 
Upvote 0
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
-------------------
Gợi ý cho các bạn:
- Có 2 cái Context Menu được thiết kế riêng cho 2 chế độ Normal và PageBreak
- Cả 2 đều được gọi tên là Cell
- Nếu ta dùng CommandBars("Cell") thì mặc định Excel sẽ xem như ta đang nói đến cái Context Menu ở chế độ Normal
- Ở mọi version, 2 Context Menu này đều có 1 điểm chung:
Mã:
CommandBars("Cell ở chế độ PageBreak").Index = CommandBars("Cell ở chế độ Normal").Index + 3
-------------------
Phù... Mời các bác xơi!
 
Upvote 0
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
-------------------
Gợi ý cho các bạn:
- Có 2 cái Context Menu được thiết kế riêng cho 2 chế độ Normal và PageBreak
- Cả 2 đều được gọi tên là Cell
- Nếu ta dùng CommandBars("Cell") thì mặc định Excel sẽ xem như ta đang nói đến cái Context Menu ở chế độ Normal
- Ở mọi version, 2 Context Menu này đều có 1 điểm chung:
Mã:
CommandBars("Cell ở chế độ PageBreak").Index = CommandBars("Cell ở chế độ Normal").Index + 3
-------------------
Phù... Mời các bác xơi!
Chính xác là như vậy. Microsoft cũng có nói vụ Index +3 này.

Tiếp một câu mới. Đang trong không khí mừng sinh nhật GPE lần 9 nên lấy số 9 đố luôn:
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.
 
Upvote 0
Chính xác là như vậy. Microsoft cũng có nói vụ Index +3 này.

Tiếp một câu mới. Đang trong không khí mừng sinh nhật GPE lần 9 nên lấy số 9 đố luôn:
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.

Cái vụ Context Menu kia chưa chắc có người làm ra đâu mà đã vội đố câu mới thế?
--------------------
Còn vụ "Sheet không ẩn thứ 9" nghĩa là sao ta? Tức sheet nào ẩn thì không tính? Số 9 là đang nói đến Index?
 
Upvote 0
Cái vụ Context Menu kia chưa chắc có người làm ra đâu mà đã vội đố câu mới thế?
Anh nói rõ thế rồi còn gì nữa mà làm không ra.
Còn vụ "Sheet không ẩn thứ 9" nghĩa là sao ta? Tức sheet nào ẩn thì không tính? Số 9 là đang nói đến Index?
Đúng vậy, ví dụ file có 10 sheet, sheet 1 ẩn thì "Sheet không ẩn thứ 9" là sheet có Index = 10 trong file.
 
Upvote 0
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
Em xin cảm ơn ạ.
Thực ra, em có đọc đoạn đó rồi.
Ngay trong link nguồn cũng trích dẫn: https://msdn.microsoft.com/en-us/library/office/gg469862(v=office.14).aspx
Note:
There are two Cell context menus in Microsoft Excel, One is the standard menu and the second one you see when you are in page break preview mode. Page break preview mode shows you what data appears on each page and enables you to quickly adjust the print area and page breaks. To activate page break preview mode, on the ribbon, click View, and then click Page Break Preview. If you want to change the second type of menu then use the following statement.
Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)
This information also applies to the Row and Column context menus.

p/s: Bạn nào muốn thử thì thay dòng:
Mã:
[COLOR=#000000][COLOR=#0000BB]Set ContextMenu [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]CommandBars[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Cell"[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
Bằng dòng:
Mã:
Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)
 
Upvote 0
Em xin cảm ơn ạ.
Thực ra, em có đọc đoạn đó rồi.
Ngay trong link nguồn cũng trích dẫn: https://msdn.microsoft.com/en-us/library/office/gg469862(v=office.14).aspx


p/s: Bạn nào muốn thử thì thay dòng:
Mã:
[COLOR=#000000][COLOR=#0000BB]Set ContextMenu [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Application[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]CommandBars[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]"Cell"[/COLOR][COLOR=#007700])[/COLOR][/COLOR]
Bằng dòng:
Mã:
Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)
Vậy để lúc nào cũng hiện Menu dù ở Normal hay Pagebreak thì phải viết thế nào bạn ơi
 
Upvote 0
Tiếp một câu mới. Đang trong không khí mừng sinh nhật GPE lần 9 nên lấy số 9 đố luôn:
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.

Làm cách nào đó có thể Select All Sheets thì mọi chuyện xem như xong!
(Tuy nhiên không phải chuyện dễ! Bởi Select All Sheets bằng tay sẽ khác với Select All Sheets khi dùng code. Hic... Mình vẫn chưa làm ra)
 
Upvote 0
Nhìn bài 1038 là biết có chịu khó tra google để tìm thông tin nhưng mà tra chưa... tới bến
Ẹc... Ẹc...
-------------------
Gợi ý cho các bạn:
- Có 2 cái Context Menu được thiết kế riêng cho 2 chế độ Normal và PageBreak
- Cả 2 đều được gọi tên là Cell
- Nếu ta dùng CommandBars("Cell") thì mặc định Excel sẽ xem như ta đang nói đến cái Context Menu ở chế độ Normal
- Ở mọi version, 2 Context Menu này đều có 1 điểm chung:
Mã:
CommandBars("Cell ở chế độ PageBreak").Index = CommandBars("Cell ở chế độ Normal").Index + 3
-------------------
Phù... Mời các bác xơi!
Cái này em thấy trên máy em không có đúng.

Dùng Sub sau để test index

Mã:
Sub Test()
    Dim ContextMenu As CommandBar
    Dim i As Long
    For Each ContextMenu In Application.CommandBars
        i = i + 1
        Cells(i, 1) = ContextMenu.Index
        Cells(i, 2) = ContextMenu.Name
    Next
End Sub

Trả về 2 context name "Cell" tương ứng 2 giá trí 11 và 40.
Vậy nếu đem 11+3 <> 40 và thực tế em cũng không thể chạy được trên máy mình với cách trên.
 
Upvote 0
Cái này em thấy trên máy em không có đúng.

Dùng Sub sau để test index

Mã:
Sub Test()
    Dim ContextMenu As CommandBar
    Dim i As Long
    For Each ContextMenu In Application.CommandBars
        i = i + 1
        Cells(i, 1) = ContextMenu.Index
        Cells(i, 2) = ContextMenu.Name
    Next
End Sub

Trả về 2 context name "Cell" tương ứng 2 giá trí 11 và 40.
Vậy nếu đem 11+3 <> 40 và thực tế em cũng không thể chạy được trên máy mình với cách trên.

Thế bạn dùng Excel phiên bản nào?
Đã test trên Excel 2003, Excel 2007 và Excel 2010 hoàn toàn không có vấn đề. Nếu bạn dùng Excel 2013 thì... chả biết
 
Upvote 0
Thế bạn dùng Excel phiên bản nào?
Đã test trên Excel 2003, Excel 2007 và Excel 2010 hoàn toàn không có vấn đề. Nếu bạn dùng Excel 2013 thì... chả biết
Em dùng Excel 2010 như đã nói ở trên. Test trên Excel 2013 thì 2 index lần lượt là 15 va 41.
Đây là Excel có bản quyền. Em cũng không thể giải thích được điều này
 
Upvote 0
Em dùng Excel 2010 như đã nói ở trên. Test trên Excel 2013 thì 2 index lần lượt là 15 va 41.
Đây là Excel có bản quyền. Em cũng không thể giải thích được điều này

Thế thì tôi không biết! Bởi chỉ mình máy bạn nó.. hơi lạ
Bạn thử sang máy tính khác xem
 
Upvote 0
Làm cách nào đó có thể Select All Sheets thì mọi chuyện xem như xong!
(Tuy nhiên không phải chuyện dễ! Bởi Select All Sheets bằng tay sẽ khác với Select All Sheets khi dùng code. Hic... Mình vẫn chưa làm ra)
Cũng chưa chắc xong đâu anh.
Nếu muốn Select All Sheets thì gọi lệnh này
PHP:
Application.CommandBars("Ply").Controls("&Select All Sheets").Execute
Tuy nhiên, lệnh này nếu gọi từ Menu thì Excel sẽ chỉ chọn những sheet không ẩn nhưng nếu gọi bằng lệnh .Execute thì nó chọn tất tần tật, VeryHidden cũng chọn luôn :D
 
Upvote 0
Cũng chưa chắc xong đâu anh.
Nếu muốn Select All Sheets thì gọi lệnh này
PHP:
Application.CommandBars("Ply").Controls("&Select All Sheets").Execute
Tuy nhiên, lệnh này nếu gọi từ Menu thì Excel sẽ chỉ chọn những sheet không ẩn nhưng nếu gọi bằng lệnh .Execute thì nó chọn tất tần tật, VeryHidden cũng chọn luôn :D

Thì tôi đã nói rồi đấy:
(Tuy nhiên không phải chuyện dễ! Bởi Select All Sheets bằng tay sẽ khác với Select All Sheets khi dùng code. Hic... Mình vẫn chưa làm ra)
Nên vẫn đang.. khoai
Vì nếu dùng code mà chọn sheets được như ta chọn bằng tay thì.. xong liền
 
Upvote 0
Thì tôi đã nói rồi đấy:

Nên vẫn đang.. khoai
Vì nếu dùng code mà chọn sheets được như ta chọn bằng tay thì.. xong liền
SendKeys cũng không được luôn :D
PHP:
Application.CommandBars("Ply").Controls("&Select All Sheets").Execute
Application.SendKeys ("s")
 
Upvote 0
Thế thì tôi không biết! Bởi chỉ mình máy bạn nó.. hơi lạ
Bạn thử sang máy tính khác xem
Em đã tiến hành test trên 4 máy nữa ngoài 2 kết quả nêu trên, 3 máy dùng Excel 2010, 1 máy Excel 2013 và kết quả như sau:
Excel 2010: (37-39), (11-14), (13-40)
Excel 2013: (11-38)
Như vậy với kết quả test trên 6 máy dùng Office bản quyền có thể thấy trường hợp em đã làm thì nguyên tắc 2 “Cell” cách nhau 3 cũng chưa có đúng lắm.
 
Upvote 0
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.
Gợi ý: Excel có một CommandBar mà Caption của các Control trên đó là tên các Sheet không ẩn của file hiện hành.
 
Upvote 0
Gợi ý: Excel có một CommandBar mà Caption của các Control trên đó là tên các Sheet không ẩn của file hiện hành.
Hay!
Gợi ý thế xem như.. xong chuyện
Mấy vụ này đúng là xài hàng ngày mà ít khi để ý nên mò muốn lòi con mắt cũng không ra
Ẹc... Ẹc...
 
Upvote 0
Không dùng vòng lặp, xác định tên sheet không ẩn thứ 9 trong file hiện hành. Nếu không có thì thông báo tổng số sheet không ẩn trong file hiện hành.

Trong câu hỏi này còn có vế thứ 2 (màu đỏ) thấy cũng.. cay
Cái thằng Control ấy hình như luôn chứa 16 phần tử (bất kể có bao nhiêu sheet). Trường hợp file tôi chỉ có 3 sheet thì vẫn tìm ra được phần tử thứ 9 (cái chuỗi tào lao gì đó). Như thế làm sao ĐẾM được số sheet không ẩn ta?
Chưa nghĩ ra vụ này
???
 
Upvote 0
Trong câu hỏi này còn có vế thứ 2 (màu đỏ) thấy cũng.. cay
Cái thằng Control ấy hình như luôn chứa 16 phần tử (bất kể có bao nhiêu sheet). Trường hợp file tôi chỉ có 3 sheet thì vẫn tìm ra được phần tử thứ 9 (cái chuỗi tào lao gì đó). Như thế làm sao ĐẾM được số sheet không ẩn ta?
Chưa nghĩ ra vụ này
???
Nếu số sheet không ẩn trong file bé hơn 16 thì trong 16 Control đó, cái nào không phải tên sheet thì đều là cái chuỗi tào lao đó.
Trong một hàng dài có một đám TÀO LAO, gọi TÀO LAO thì thằng TÀO LAO đứng trước sẽ nghe :D
 
Upvote 0
Nếu số sheet không ẩn trong file bé hơn 16 thì trong 16 Control đó, cái nào không phải tên sheet thì đều là cái chuỗi tào lao đó.
Trong một hàng dài có một đám TÀO LAO, gọi TÀO LAO thì thằng TÀO LAO đứng trước sẽ nghe :D

Có một trường hợp đặc biết khá buồn cười: sheet không ẩn cũng có tên TÀO LAO luôn +-+-+-+ (lại phải để ý vụ này)
 
Lần chỉnh sửa cuối:
Upvote 0
Có một trường hợp đặc biết khá buồn cười: sheet không ẩn cũng có tên TÀO LAO luôn +-+-+-+ (lại phải để ý vụ này)
Vụ này thì em không biết.
Cũng không có ai khác tham gia nên thôi công bố đáp án luôn
PHP:
Sub IX()
With Application.CommandBars("Workbook Tabs")
    If .Controls(9).Caption = "&Sheet List" Then
        MsgBox "File hien tai chi co " & (.Controls("&Sheet List").Index - 1) & " sheet khong an"
    Else
        MsgBox "Sheet khong an thu 9 la: " & Replace(.Controls(9).Caption, "&&", "&")
    End If
End With
End Sub
 

File đính kèm

Upvote 0
Upvote 0
Vậy bạn thử câu này thử có vui không nha :D
--
Thủ tục sau có khi nào bị lỗi không
PHP:
Sub CoLoiKhong()
ActiveCell.Value = ActiveCell.Value
End Sub
Gợi ý thêm một trường hợp: Khi không có ActiveCell (ActiveCell Is Nothing = True) thì sẽ báo lỗi. Vậy khi nào thì không có ActiveCell?
 
Upvote 0
Gợi ý thêm một trường hợp: Khi không có ActiveCell (ActiveCell Is Nothing = True) thì sẽ báo lỗi. Vậy khi nào thì không có ActiveCell?
Cái này hình như hay nè. Vì 1 cái quỷ khác đang active thí dụ như là 1 shape, 1 picture, 1 chart, ... nói chung là 1 object hỏng phải cell
 
Upvote 0
Cái này hình như hay nè. Vì 1 cái quỷ khác đang active thí dụ như là 1 shape, 1 picture, 1 chart, ... nói chung là 1 object hỏng phải cell

Dù Shape có đang Active thì vẫn tồn tại ActiveCell mà sư phụ nên code sẽ không lỗi
Trên Excel, có ít nhất 2 chỗ mà chắc chắn "nơi ấy" không có cái ActiveCell nào cả
Ngoài ra, vẫn còn 1 "chỗ" nữa có activecell đàng hoàng nhưng bác Bill không cho thay đổi ActiveCell
 
Upvote 0
Em tìm thấy 1 lỗi khi Activecell ở trong vùng PivotTable (chưa choose fields nào).
Kết quả: Error 400.
 
Upvote 0
Thủ tục sau có khi nào bị lỗi không
PHP:
Sub CoLoiKhong()
ActiveCell.Value = ActiveCell.Value
End Sub
Đáp án (theo mình, ai có đáp án khác thì bổ sung giúp nhé)
1. Khi Activesheet là một Chart (sẽ không có ActiveCell)
2. Khi Activesheet là một DialogSheet(sẽ không có ActiveCell)
3. Khi ActiveCell được định dạng ngày và có giá trị âm
4. Khi ActiveCell được định dạng ngày và có giá trị lớn hơn 2.958.465 (ngày 31/12/9999)

Mục đích của câu đố này là muốn các bạn chú ý đến trường hợp 3 và 4 để sau này có gặp thì biết. Mình từng gặp lỗi này khi gán giá trị từ một mảng vào một vùng và lúc đó không biết vì sao lỗi (Không phải là 1 ô mà là cả vùng lớn nên chả biết vì sao mình lỗi)

Cách khắc phục là khi gán dữ liệu xuống sheet thì dùng .Value2, sẽ không bị lỗi này.
 
Upvote 0
Câu mới

Tôi có một thủ tục như sau:
PHP:
Sub ViDu()
Dim SoA As Long, SoB As Long, KetQua1 As Long, KetQua2 As Long
'...
KetQua1 = SoA And SoB
KetQua2 = SoA Or SoB
End Sub
Đố các bạn ý nghĩa và nguyên tắc tính của KetQua1 và KetQua2
 
Upvote 0
Tôi có một thủ tục như sau:
PHP:
Sub ViDu()
Dim SoA As Long, SoB As Long, KetQua1 As Long, KetQua2 As Long
'...
KetQua1 = SoA And SoB
KetQua2 = SoA Or SoB
End Sub
Đố các bạn ý nghĩa và nguyên tắc tính của KetQua1 và KetQua2

Nhớ lúc trước có làm 1 lần trò này rồi
Ẹc... Ẹc... thí nghiệm rồi suy đoán
 
Upvote 0
Tôi có một thủ tục như sau:
PHP:
Sub ViDu()
Dim SoA As Long, SoB As Long, KetQua1 As Long, KetQua2 As Long
'...
KetQua1 = SoA And SoB
KetQua2 = SoA Or SoB
End Sub
Đố các bạn ý nghĩa và nguyên tắc tính của KetQua1 và KetQua2
Cách tính: biểu diễn 2 số dưới dạng nhị phân rồi làm phép toán trên từng cặp bit của 2 số. Ví dụ 5 (101 binary) and 3 (11 binary) = 1.
Ý nghĩa: dùng để lưu thông tin của nhiều biến boolean (mỗi biến này thường gọi là các cờ - flag) vào 1 biến long duy nhất. Sau đó các phép toán and, or, xor sẽ được dùng để thao tác trên các cờ này. Ví dụ biến A lưu thông tin về các cờ, biến B thường gọi là mặt nạ(mask), mình ví dụ A và B có 3 bit (thực tế là 32 bit). Khi muốn xóa 1 cờ (ví dụ cờ số 2 đang là 1 hoặc 0 trở thành 0) và giữ nguyên các cờ khác, ta dùng A and 5 (101 binary); để đặt 1 cờ thành 1 (ví dụ cờ số 2), ta dùng A or 2 (010 binary); để đảo cờ số 2 (1 thành 0, 0 thành 1) ta dùng A xor 2 (010 binay).
Mình cũng không rõ vba có XOR không vì viết bằng điện thoại.
 
Upvote 0
Rảnh rỗi sinh nông nỗi, tôi đố các bạn thủ tục nào, câu lệnh nào để ngăn không cho thông báo có lưu file hay không?

Ứng dụng: Một file mà ta chỉ cần thực hiện cái mình cần thiết (in ấn, xuất biểu mẫu ra file khác, v.v...), nhưng không muốn lưu lại cho file đó, khi thoát file thường xuất hiện thông báo (hình), nên việc không cho thông báo khi thoát file là "không cần đắn đo".

Vậy bằng cách nào?
 

File đính kèm

  • ThongBao.jpg
    ThongBao.jpg
    20.1 KB · Đọc: 39
Lần chỉnh sửa cuối:
Upvote 0
Rảnh rỗi sinh nông nỗi, tôi đố các bạn thủ tục, sự kiện nào để ngăn không cho thông báo có lưu file hay không?

Ứng dụng: Một file mà ta chỉ cần thực hiện cái mình cần thiết (in ấn, xuất biểu mẫu ra file khác, v.v...), nhưng không muốn lưu lại cho file đó, khi thoát file thường xuất hiện thông báo (hình), nên việc không cho thông báo khi thoát file là "không cần đắn đo".

Vậy bằng cách nào?
giờ mấy giờ rồi anh Nghĩa ? lêu lêu
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Close False
End Sub
 
Upvote 0
Rảnh rỗi sinh nông nỗi, tôi đố các bạn thủ tục nào, câu lệnh nào để ngăn không cho thông báo có lưu file hay không?

Ứng dụng: Một file mà ta chỉ cần thực hiện cái mình cần thiết (in ấn, xuất biểu mẫu ra file khác, v.v...), nhưng không muốn lưu lại cho file đó, khi thoát file thường xuất hiện thông báo (hình), nên việc không cho thông báo khi thoát file là "không cần đắn đo".

Vậy bằng cách nào?
Mã:
[COLOR=#00008B]Sub[/COLOR][COLOR=#000000] Workbook_BeforeSave[/COLOR][COLOR=#000000]([/COLOR][COLOR=#00008B]ByVal[/COLOR][COLOR=#000000] SaveAsUI [/COLOR][COLOR=#00008B]As[/COLOR][COLOR=#00008B]Boolean[/COLOR][COLOR=#000000],[/COLOR][COLOR=#000000] Cancel [/COLOR][COLOR=#00008B]As[/COLOR][COLOR=#00008B]Boolean[/COLOR][COLOR=#000000])[/COLOR][COLOR=#000000]
    MsgBox [/COLOR][COLOR=#800000]"You can't save this workbook!"[/COLOR][COLOR=#000000]
    Cancel [/COLOR][COLOR=#000000]=[/COLOR][COLOR=#800000]True[/COLOR][COLOR=#000000]
[/COLOR][COLOR=#00008B]End [/COLOR][COLOR=#00008B]Sub[/COLOR]
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • KhoQua.jpg
    KhoQua.jpg
    18.9 KB · Đọc: 40
Upvote 0
Mã:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI AsBoolean, Cancel As Boolean)

    MsgBox "You can't save this workbook!"
    Cancel =True

End Sub

Khổ quá, có đụng chạm gì đến nút Save đâu mà sự kiện này được kích hoạt! Đã ngăn không cho Save bấm vào nó làm gì nè!
 
Upvote 0
Trong Video có thây Close gì đâu? Còn vụ Recover là sao ta?-+*/
không nhìn thấy Close thì cần xem video 0:28 -> 0:32 vặn xem ở tốc độ thấp nhất
===================================
mà xem cái này dài hơn tí nè
[video=youtube;-L6RZfqzeRM]https://www.youtube.com/watch?v=-L6RZfqzeRM&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Upvote 0
không nhìn thấy Close thì cần xem video 0:28 -> 0:32 vặn xem ở tốc độ thấp nhất
===================================
mà xem cái này dài hơn tí nè

Kakakakak, cái này được đó, nhưng để nhiều người tham gia chơi cho vui rồi đồng chí thử đưa câu trả lời!

(Cũng nhiều người vào xem mà chưa có quan tâm hen: VetMini, mhung12005, concogia, HungQuoc49, hpkhuong, VMH0307, moneymong.pt, khuongvietphong, tvpnet1983, quanghai1969, befaint)

[video=youtube;OmEKaSX79a4]https://www.youtube.com/watch?v=OmEKaSX79a4&feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Upvote 0
Kakakakak, cái này được đó, nhưng để nhiều người tham gia chơi cho vui rồi đồng chí thử đưa câu trả lời!

[video=youtube;OmEKaSX79a4]https://www.youtube.com/watch?v=OmEKaSX79a4&feature=youtu.be[/video]

anh tham gia diễn đàn lâu hơn tôi mà , anh phải biết muốn có nhiều người tham gia chơi vui là phải nghĩ ra câu hỏi cực xoáy cực độc mới được .....
 
Upvote 0
anh tham gia diễn đàn lâu hơn tôi mà , anh phải biết muốn có nhiều người tham gia chơi vui là phải nghĩ ra câu hỏi cực xoáy cực độc mới được .....
Ủa, đố vui mà, ngắn gọn và hiệu quả, nhưng cũng bất ngờ, ở diễn đàn bây giờ, tìm được câu đố mà chưa có trong diễn là hiếm đó, thử hỏi cái gì mà không có trên diễn đàn này? Hầu như về lập trình cho Excel đều có hết đáp án rồi!

Khó khăn lắm tôi mới tìm được một đề tài vừa tầm để đố, chứ thư viện API mà đem vào đố chắc biết mấy ai tham gia?
 
Upvote 0
Mấy bác này làm những chuyện siêu nhân gao quá mình không hiểu lý do tại sao lại được nhỉ.
 
Upvote 0
Mấy bác này làm những chuyện siêu nhân gao quá mình không hiểu lý do tại sao lại được nhỉ.
link MS
https://support.microsoft.com/en-us/kb/213428
In Microsoft Excel, you can create a Microsoft Visual Basic for Applications (VBA) macro that suppresses the "Save Changes" prompt when you close a workbook. You can do this either by specifying the state of the workbook's Saved property or by suppressing all alerts for the workbook.
 
Upvote 0
Thử Google
Mã:
".Close False" site:www.giaiphapexcel.com
xem có bao nhiêu kết quả và cũ nhất là khi nào.
 
Upvote 0
Upvote 0

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

Back
Top Bottom