Đố 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
 
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

  • HiddenComment.xlsx
    15.9 KB · Đọc: 19
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

  • menu content.zip
    23.2 KB · Đọc: 7
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
Web KT

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

Back
Top Bottom