Vấn đề hiển thị Menu tự tạo trong Excel 2007 (1 người xem)

Liên hệ QC

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

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,725
Giới tính
Nam
Với excel 2007, tôi muốn cái Menu tự tạo (nó tự động group lại trong tab Add-Ins), khi tôi mở file, thì mặc định tab Add-Ins này hiển thị, không phải là tab Home có được không?

Xin cám ơn rất nhiều!
 
Với excel 2007, tôi muốn cái Menu tự tạo (nó tự động group lại trong tab Add-Ins), khi tôi mở file, thì mặc định tab Add-Ins này hiển thị, không phải là tab Home có được không?

Xin cám ơn rất nhiều!

Can thiệp vào menu 2007, 2010 thì phải dùng ngôn ngữ xml môtar cấu trúc của menu chứ không dùng cách làm kiểu CommandBar như trước đây.
Thiện có thể dùng chương trình OfficeCustomUIEditor để tạo menu cho file của mình.
download tại đây:
http://openxmldeveloper.org/articles/customuieditor.aspx
 

File đính kèm

Không biết có phải Nghĩa muốn thế này:

Add-in2003.jpg


Add-in của thầy Phạm Duy Long viết cho 2003, tự hiển thị trong tab add-in.

Còn hình này là add-in viết cho 2007, 2010 và nó hiển thị 1 tab riêng. Tuân nói có lẽ là cái này:

Add-in2007.jpg


Chưa thấy code nào viết add-in xong nó nhảy vào Home?
 
Để thiết kế menu Ribbon cần phối hợp các công cụ để soạn thảo cấu trúc file CustomUI.XML.
Đây là đoạn xml tạo menu trong tab "Home" với nhóm lệnh "www.bluesofts.net" với 3 nút lệnh bên trong: Mở tệp", "Lưu têph", "Đóng tệp"
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">		
          <tabs>
		<tab idMso="TabHome">			
			<group id="MyGroup" label="www.bluesofts.net">
				<button id="cmdOpen" label="Mở tệp" size="large" onAction="DoMoTep" imageMso="ImportSavedImports" />
				<button id="cmdSave" label="Lưu Tệp" size="large" onAction="DoLuuTep" imageMso="FileSaveAsCurrentFileFormat" />
				<button id="cmdClose" label="Đóng Tệp" size="large" onAction="DoDongTep" imageMso="FileClose" />
			</group>
		</tab>		
	   </tabs>	
	</ribbon>
</customUI>
 

File đính kèm

Trước tiên vài lời về cấu trúc nội dung mà ta sẽ phải soạn thảo.
Nội dung bắt đầu bằng 2 thẻ:
Mã:
<customUI xmlns="[URL]http://schemas.microsoft.com/office/2006/01/customui[/URL]" >
<ribbon>
và kết thúc bằng
Mã:
</ribbon>
</customUI>
Phần trên là bắt buộc. Mọi cái ta thêm vào thì ta viết trong thẻ:
Mã:
<ribbon>
...
</ribbon>
Tiếp theo nếu ta muốn thêm menu vào nút Office thì ta phài có thẻ
Mã:
<officeMenu>
...
</officeMenu>
Còn nếu ta muốn thêm vào thẻ có sẵn hoặc tạo thẻ mới thì ta phải có thẻ
Mã:
<tabs>
...
</tabs>
Và trong thẻ đó ta phải có "bằng này" thẻ
Mã:
<tab>
...
</tab>
nếu ta muốn thêm menu vào "bằng này" thẻ có sẵn - tạo mới.
Trong mỗi thẻ
Mã:
<officeMenu>
...
</officeMenu>
hoặc
<tab>
...
</tab>
thì nội dung tùy thuộc vào menu mà ta định thêm vào. Mục menu đơn? Nhóm menu? v...v
Tôi đã soạn hình như là đủ mọi kiểu menu.
Tóm lại cấu trúc của văn bản soạn cho Custom UI Editor là:
Mã:
<customUI xmlns="[URL]http://schemas.microsoft.com/office/2006/01/customui[/URL]" >
<ribbon>
<officeMenu>
...
</officeMenu>
<tabs>
<tab>
...
</tab>
...
<tab>
...
</tab>
</tabs>
</ribbon>
</customUI>

Trong ví dụ đính kèm tôi gộp cả 3 loại ví dụ. Tức thêm menu "ở mọi nơi"

--------------------
Một trong các cách thêm các nút lệnh, trình đơn vào trong dải menu của Excel là cách dùng nội dung XML. Cách làm như sau:

1. Cần tải về và cài đặt Custom UI Editor. Tôi cũng đã đính kèm Custom UI Editor ở dưới
Trước khi cài có thể cần cài .NET framework ≥ 3

2. Soạn nội dung mà ta sẽ phải dán vào cửa sổ của Custom UI Editor
Tùy theo việc ta định làm gì mà nội dung khác nhau. Sau đây là 3 nội dung ví dụ:

a. Thêm nút hoặc menu vào Backstage hoặc nút Office. Nội dung:
<!-- Thêm mục mới trong danh sách menu hiển thị sau khi nhấn vào nút Office. Nội dung được thêm vào tập tin chan_dai.xlsm -->
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<!-- Thêm 1 nút và 1 menu có 7 lựa chọn vào menu của Excel trong nút Office-->
<!-- Thêm 1 nút vào menu Print của Excel và thêm 1 nút vào menu Prepare-->
<!-- chú ý cách dùng &amp; để gạch dưới một chữ cái trong tên của menu -->

<ribbon>
<officeMenu>
<!-- Thêm 1 nút vào menu -->
<button id="customButton1" label="&amp;Nút của tôi" onAction="Macro1" imageMso="DirectRepliesTo" />
<!-- Thêm 1 nút và 1 menu có 7 lựa chọn vào menu của Excel -->
<menu id="MyDropdownMenu" label="&amp;Trình đơn của tôi" imageMso="HappyFace" >
<button id="customButton2" label="Nút thứ 2" onAction="Macro2" imageMso="TextAlignGallery" />
<button id="customButton3" label="Nút thứ 3" onAction="Macro3" imageMso="TextAlignGallery" />
<button id="customButton4" label="Nút thứ 4" onAction="Macro4" imageMso="TextAlignGallery" />
<button id="customButton5" label="Nút thứ 5" onAction="Macro5" imageMso="TextAlignGallery" />
<button id="customButton6" label="Nút thứ 6" onAction="Macro6" imageMso="TextAlignGallery" />
<button id="customButton7" label="Nút thứ 7" onAction="Macro7" imageMso="TextAlignGallery" />
<button id="customButton8" label="Nút thứ 8" onAction="Macro8" imageMso="TextAlignGallery" />
</menu>
<!-- Thêm 1 nút vào menu Print của Excel -->
<splitButton idMso="FilePrintMenu">
<menu>
<button id="customButton9" label="Nút thứ 9" onAction="Macro9" imageMso="FilePrint" description="Miêu tả gì đó"/>
</menu>
</splitButton>
<!-- Thêm 1 nút vào menu Prepare của Excel -->
<menu idMso="FilePrepareMenu">
<button id="customButton10" label="Nút thứ 10" onAction="Macro10" imageMso="HappyFace" description="Một chút miêu tả"/>
</menu>
</officeMenu>
</ribbon>
</customUI>

b. Thêm nút hoặc menu vào thẻ có sẵn của Excel. Nội dung:
<!-- Thêm nút hoặc menu vào một thẻ nào đó, vd. thẻ Home -->
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

<ribbon>
<tabs>
<!-- thêm 1 nhóm gồm 3 nút và menu có 5 mục vào thẻ Home -->
<tab idMso="TabHome" >
<group id="customGroup1" label="Nhóm gì đó" insertAfterMso="GroupEditingExcel" >
<button id="customButton1" label="Nút thứ 1" size="normal" onAction="Macro1" imageMso="DirectRepliesTo" />
<button id="customButton2" label="Nút thứ 2" size="normal" onAction="Macro2" imageMso="AccountMenu" />
<button id="customButton3" label="Nút thứ 3" size="normal" onAction="Macro3" imageMso="RegionLayoutMenu" />
<separator id="MySeparator1" />
<menu id="MyDropdownMenu" label="Menu của riêng tôi" size="large" imageMso="TextAlignGallery" >
<button id="customButton4" label="Nút thứ 4" onAction="Macro4" imageMso="TextAlignGallery" />
<button id="customButton5" label="Nút thứ 5" onAction="Macro5" imageMso="TextAlignGallery" />
<button id="customButton6" label="Nút thứ 6" onAction="Macro6" imageMso="TextAlignGallery" />
<button id="customButton7" label="Nút thứ 7" onAction="Macro7" imageMso="TextAlignGallery" />
<button id="customButton8" label="Nút thứ 8" onAction="Macro8" imageMso="TextAlignGallery" />
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

c. Thêm thẻ mới vào Ribbon. Nội dung:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<!-- Thêm thẻ mới vào Ribbon -->
<ribbon>
<tabs>
<tab id="MyCustomTab" label="Thẻ riêng của tôi" insertAfterMso="TabHome">
<!-- thêm nhóm gồm 2 nút -->
<group id="customGroup1" label="Nhóm thứ 1">
<button id="customButton1" label="Nút thứ 1" size="normal" onAction="Macro1" imageMso="PrintPreviewShrinkOnePage" />
<separator id="MySeparator1" />
<button id="customButton2" label="Nút thứ 2" size="large" onAction="Macro2" imageMso="ReviewPreviousComment" />
</group>
<!-- thêm nhóm gồm menu có 2 nút -->
<group id="customGroup2" label="Nhóm thứ 2">
<menu id="MyDropdownMenu" label="Menu của tôi" size="large" imageMso="TextAlignGallery" >
<button id="customButton3" label="Nút thứ 3" onAction="Macro3" imageMso="TextAlignGallery" />
<button id="customButton4" label="Nút thứ 4" onAction="Macro4" imageMso="TextAlignGallery" />
</menu>
</group>
<!-- thêm nhóm gồm splitButton trong đó có 1 nút và 1 menu có 2 nút -->
<group id="customGroup3" label="Nhóm thứ 3">
<splitButton id="mySplitButton" size="large">
<button id="customButton5" imageMso="HappyFace" label="Nút thứ 5" supertip="Đây là splitButton." onAction="Macro5"/>
<menu id="splitMenu" itemSize="large">

<button id="customButton6" imageMso="FormatPainter" label="Nút thứ 6" onAction="Macro6" description="Miêu tả gì đó"/>
<button id="customButton7" imageMso="FormatPainter" label="Nút thứ 7" onAction="Macro7" description="Miêu tả nhé"/>
</menu>
</splitButton>
</group>
<!-- thêm nhóm gồm 2 cụm nút, mỗi cụm 2 nút -->
<group id="customGroup4" label="Nhóm thứ 4">
<buttonGroup id="mybuttonGroup1">
<button id="customButton8" label="Nút thứ 8" showLabel="false" onAction="Macro8" imageMso="ReviewPreviousComment" />
<button id="customButton9" label="Nút thứ 9" showLabel="false" onAction="Macro9" imageMso="ReviewPreviousComment" />
</buttonGroup>
<buttonGroup id="mybuttonGroup2">
<button id="customButton10" label="Nút thứ 10" showLabel="false" onAction="Macro10" imageMso="HappyFace" />
<button id="customButton11" label="Nút thứ 11" showLabel="false" onAction="Macro11" imageMso="HappyFace" />
</buttonGroup>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

3. Các bước thực hiện
a. Mở Excel --> lưu lại với tên vd. chan_dai.xlsm --> đóng Excel

b.

View attachment 92948



Mở Custom UI Editor --> mởi tập tin chan_dai.xlsm vừa lưu --> chuột phải vào chan_dai.xlsm và chọn "Office 2007 (2010) Custom UI Part --> dán nội dung ở phần 2 vào cửa sổ bên phải --> nhấn nút cuối cùng trên dải menu (Generate Callbacks) --> bôi đen nội dung vừa được tạo ra và dán vào bộ nhớ đệm (Ctrl + C) --> click vào chan_dai.xlsm ở nửa trái để hiển thị lại nội dung viết ở phần 2 --> lưu lại tập tin chan_dai.xlsm --> đóng Custom UI Editor
Chú ý: Khi mở Excel thì Excel xóa clipboard nên hoặc ta mở Excel xong rồi mới dán vào clipboard hoặc dán vào clipboard rồi từ đó dán tạm thời vào notepad rồi mở Excel.

c. Mở Excel --> mở tập tin chan_dai.xlsm --> ta đã thấy có menu mà ta thêm vào. Nhưng nhấn chuột vào thì chưa có gì, thậm chí Excel thông báo lỗi, vì ta chưa viết code để gán cho các nút ta thêm vào.
Nhấn Alt + F11 để mở VBA. Nhấn Insert --> Module để thêm môđun --> Dán code đã lưu vào bộ nhớ đệm ở điểm b (Ctrl + V) --> bổ sung code để phục vụ các nút.
Chọn save để lưu lại chan_dai.xlsm

d. Nếu chan_dai.xlsm ta định làm addin thì ta làm như sau:
Trong cửa sổ VBA ta nhấn vào ThisWorkbook --> chuyển IsAddin sang TRUE --> chọn save --> VBA chỉ cho phép ta lưu lại thành chan_dai.xlam.
chan_dai.xlam ta thêm vào Add_ins để mỗi lần mở Excel là có.
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu tạo Menu trên word thì thế nào hả bác, nó có tương tự như excel ko? em tìm mãi mà ko thể nào add được, chỉ sử dụng code chạy trong VBA để tạo, mà ko gán được toán tử với tiếng Việt?
 
Các bác cho em hỏi: phải viết như thế nào thì trong menu mới hiển thị tiếng việt.
ví dụ: trong file chan_dai có đoạn "N u & # 7 6 9 ; t th & # 4 3 2 ; & # 7 6 9 ; 4"<---> "nút thứ 4", e phải viết nó như thế nào ạ.
p/s: E không phải là dân tin học, làm ơn càng chi tiết càng tốt.
Em xin cảm ơn !
 
Lần chỉnh sửa cuối:
Các bác cho em hỏi: phải viết như thế nào thì trong menu mới hiển thị tiếng việt.
ví dụ: trong file chan_dai có đoạn "N u & # 7 6 9 ; t th & # 4 3 2 ; & # 7 6 9 ; 4"<---> "nút thứ 4", e phải viết nó như thế nào ạ.
p/s: E không phải là dân tin học, làm ơn càng chi tiết càng tốt.
Em xin cảm ơn !

Mọi chuỗi mà bạn viết trong Custom UI Editor phải có dạng thường dùng vd. trên những trang web, tức dạng UTF-8.
Nếu muốn thử để tin tưởng thì trong bài viết trên GPE bạn hãy gõ đoạn "N u & # 7 6 9 ; t" nhưng viết liền không có dấu cách thì bạn sẽ nhìn thấy là trình duyệt biến chuỗi đó thành "Nút"

Nói nôm na thì thế này. Bạn có 1 chuỗi nào đó. Bạn sẽ biến nó thành chuỗi "thường dùng ..." như thế nào? Bạn hãy đọc từng ký tự của chuỗi nguồn. Nếu ký tự đó có code < &H80 = 128 thì bạn để nguyên. Nếu ký tự đó có code > &H80 = 128 thì bạn thay ký tự đó bằng "cụm có 4 thành phần viết liền nhau". Thành phần 1 là ký tự "&". Thành phần 2 là ký tự "#". Thành phần 3 là con số viết ở hệ thập phân (tức vd. không phải là &H80 mà là 128), tức hệ 10 - con số này chính là code của ký tự kia. Thành phần 4 là ký tự ";" (dấu chấm phẩy)

Ví dụ chuỗi "Nút". Tại sao tôi lại viết là ""N u & # 7 6 9 ; t"? Do tôi viết trong notepad nên chuỗi đó là unicode tổ hợp. Nó gồm 4 ký tự là N, u, dấu sắc, và t. 3 ký tự N, u, t có code < 128 nên để nguyên. Riêng dấu sắc có code = &H0301 = 769 (giá trị trong hệ 10) nên dấu sắc thay bằng "& # 7 6 9 ;". Tất nhiên tất cả phải viết liền không có dấu cách.

Nếu bạn viết chữ "Nút" mà dùng unicode dựng sẵn thì chuỗi đó chỉ có 3 ký tự: N, ú (dựng sẵn), t. Mà "ú" (dựng sẵn) có code = &HFA = 250 nên chuỗi sau khi biến hóa phải là "N & # 250; t" (tất nhiên phải viết liền. Tôi viết cách để hiển thị cho bạn xem. Nếu viết liền thì trình duyệt biến chuỗi đó thành "Nút" và bạn không biết sẽ phải là thế nào).

Từ thông tin trên bạn nên viết hàm để biến chuỗi nguồn thành dạng "thường dùng ..."

Tôi viết hộ bạn.

1. Bạn tải tập tin về
2. Mở tập tin và nhấn nút để mở UserForm
3. Bạn hãy viết chuỗi nguồn vào TextBox, hoặc dán từ đâu đó vào.
4. Nhấn nút CommandButton thì trong thư mục "C:\" sẽ có tập tin "secret_string.txt" chứa chuỗi đã được "biên dịch"

Trong bước 3 bạn cũng có thể viết hoặc dán toàn bộ nội dung
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
...
</customUI>

và trong "secret_string.txt" bạn có toàn bộ nội dung đã được "biên dịch"
 

File đính kèm

Lần chỉnh sửa cuối:
Em bị lỗi "??"khi paste qua Custom UI Editor For Microsoft Office, các anh giúp em với ạ
 
Lần chỉnh sửa cuối:
Mọi chuỗi mà bạn viết trong Custom UI Editor phải có dạng thường dùng vd. trên những trang web, tức dạng UTF-8.
Nếu muốn thử để tin tưởng thì trong bài viết trên GPE bạn hãy gõ đoạn "N u & # 7 6 9 ; t" nhưng viết liền không có dấu cách thì bạn sẽ nhìn thấy là trình duyệt biến chuỗi đó thành "Nút"

Nói nôm na thì thế này. Bạn có 1 chuỗi nào đó. Bạn sẽ biến nó thành chuỗi "thường dùng ..." như thế nào? Bạn hãy đọc từng ký tự của chuỗi nguồn. Nếu ký tự đó có code < &H80 = 128 thì bạn để nguyên. Nếu ký tự đó có code > &H80 = 128 thì bạn thay ký tự đó bằng "cụm có 4 thành phần viết liền nhau". Thành phần 1 là ký tự "&". Thành phần 2 là ký tự "#". Thành phần 3 là con số viết ở hệ thập phân (tức vd. không phải là &H80 mà là 128), tức hệ 10 - con số này chính là code của ký tự kia. Thành phần 4 là ký tự ";" (dấu chấm phẩy)

Ví dụ chuỗi "Nút". Tại sao tôi lại viết là ""N u & # 7 6 9 ; t"? Do tôi viết trong notepad nên chuỗi đó là unicode tổ hợp. Nó gồm 4 ký tự là N, u, dấu sắc, và t. 3 ký tự N, u, t có code < 128 nên để nguyên. Riêng dấu sắc có code = &H0301 = 769 (giá trị trong hệ 10) nên dấu sắc thay bằng "& # 7 6 9 ;". Tất nhiên tất cả phải viết liền không có dấu cách.

Nếu bạn viết chữ "Nút" mà dùng unicode dựng sẵn thì chuỗi đó chỉ có 3 ký tự: N, ú (dựng sẵn), t. Mà "ú" (dựng sẵn) có code = &HFA = 250 nên chuỗi sau khi biến hóa phải là "N & # 250; t" (tất nhiên phải viết liền. Tôi viết cách để hiển thị cho bạn xem. Nếu viết liền thì trình duyệt biến chuỗi đó thành "Nút" và bạn không biết sẽ phải là thế nào).

Từ thông tin trên bạn nên viết hàm để biến chuỗi nguồn thành dạng "thường dùng ..."

Tôi viết hộ bạn.

1. Bạn tải tập tin về
2. Mở tập tin và nhấn nút để mở UserForm
3. Bạn hãy viết chuỗi nguồn vào TextBox, hoặc dán từ đâu đó vào.
4. Nhấn nút CommandButton thì trong thư mục "C:\" sẽ có tập tin "secret_string.txt" chứa chuỗi đã được "biên dịch"

Trong bước 3 bạn cũng có thể viết hoặc dán toàn bộ nội dung
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
...
</customUI>

và trong "secret_string.txt" bạn có toàn bộ nội dung đã được "biên dịch"
bạn co bản quy đổi không, file bạn mở xài không được, trong bảng ACCSII có mà như chữ Ư không có, còn thiếu nhiều chữ. Hoặc có cách nào viết dễ hơn ko
 
bạn co bản quy đổi không, file bạn mở xài không được, trong bảng ACCSII có mà như chữ Ư không có, còn thiếu nhiều chữ. Hoặc có cách nào viết dễ hơn ko
Bạn có thể nói cụ thể không? Cho vd. cụ thể. Kiểu như: tôi có cái này, nhưng tôi muốn có cái này ...
 
Ý tôi hỏi làm sao viết được tiếng việt khi tao Add in trong thanh ribon excel, vì trong Custom UI Editor For Microsoft Office không cho gõ tiếng việt
 
Tôi có thói quen viết mọi cái trong Notepad rồi sau đó mới copy/paste vào đích. Vd. viết bài xong trong notepad thì mới copy/paste vào GPE. Làm thế có thể vd. viết một đoạn rồi lưu lại do bận việc, lúc khác mở ra viết tiếp. Menu cho Custom UI Editor tôi cũng viết trong notepad rồi mới copy/paste vào Custom UI Editor.

Trong bài #10 tôi đã viết rất rõ, có cả tập tin đính kèm để tạo "bản dịch" để paste vào Custom UI Editor
 
Tôi có thói quen viết mọi cái trong Notepad rồi sau đó mới copy/paste vào đích. Vd. viết bài xong trong notepad thì mới copy/paste vào GPE. Làm thế có thể vd. viết một đoạn rồi lưu lại do bận việc, lúc khác mở ra viết tiếp. Menu cho Custom UI Editor tôi cũng viết trong notepad rồi mới copy/paste vào Custom UI Editor.

Trong bài #10 tôi đã viết rất rõ, có cả tập tin đính kèm để tạo "bản dịch" để paste vào Custom UI Editor
tôi có đọc có sử dụng tập tin mà nó lỗi code vba ko cho xài. tiếng việt lỗi như bên dưới. Còn viết như "N u & # 7 6 9 ", này thì được mà bảng mã ASCCII mở rộng có nhưng không đủ chữ, bảng tra chữ Ư là &#.... mấy vậy, và tra ở đâu vậy, cám ơn nhiều. Mình viết Notepad không nhúng vào excel được. Tks bạn nhiều
 

File đính kèm

  • 1560135310193.png
    1560135310193.png
    67.5 KB · Đọc: 30
Ở bài #15 tôi viết
Bạn có thể nói cụ thể không
Nhưng bạn không nói cụ thể nên tôi mất công viết bài #17.
Bây giờ bạn cũng không viết cụ thể.

1. Trong ảnh đính kèm bạn thấy cái gì "không được"?

2. Bạn viết
Còn viết như "N u & # 7 6 9 ", này thì được mà bảng mã ASCCII mở rộng có nhưng không đủ chữ,

"không đủ chữ"? Ý là gì?

3. Cách dùng tập tin "Tao chuoi cho Custom UI Editor.xlsm"
Giả sử bạn muốn có nội dung"

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon>
<tabs>
<tab id="MyCustomTab" label="Thẻ tuyệt mật" insertAfterMso="TabHome">
<group id="customGroup1" label="Nhóm 1">
<button id="customButton1" label="Nước uống có cồn" size="normal" onAction="Macro1" />
<separator id="MySeparator1" />
<button id="customButton2" label="NƯỚC UỐNG KHÔNG CÓ CỒN" size="large" onAction="Macro2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>


- Tạo tập tin XLSM, vd. Book1.xlsm -> lưu lại rồi đóng tập tin

- mở tập tin "Tao chuoi cho Custom UI Editor.xlsm" -> nhấn nút "Tạo chuỗi cho Custom UI Editor"
Tiếp theo:

- hoặc tự gõ toàn bộ nội dung kể trên vào TextBox hoặc viết ở đâu đó, vd. Notepad, rồi copy/paste vào TextBox -> nhấn nút "Tạo chuỗi" -> trên C:\ đã có tập tin secret.txt. Không phải tìm bảng tra gì cả. -> mở tập tin secret.txt và copy toàn bộ -> mở Custom UI Editor -> mở Book1.xlsm -> dán nội dung đã copy từ secret.txt vào cửa sổ soạn thảo của Custom UI Editor.

Nội dung secret.txt là
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon>
<tabs>
<tab id="MyCustomTab" label="The&#777; tuy&#234;&#803;t m&#226;&#803;t" insertAfterMso="TabHome">
<group id="customGroup1" label="Nho&#769;m 1">
<button id="customButton1" label="N&#432;&#417;&#769;c u&#244;&#769;ng co&#769; c&#244;&#768;n" size="normal" onAction="Macro1" />
<separator id="MySeparator1" />
<button id="customButton2" label="N&#431;&#416;&#769;C U&#212;&#768;NG KH&#212;NG CO&#769; C&#212;&#768;N" size="large" onAction="Macro2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>


Chú ý: nội dung như trên vì tôi gõ unicode tổ hợp do tôi dùng bàn phím Windows. Bạn có thể dùng unicode dựng sẵn.

Tôi đã viết code thì bạn chỉ việc gõ văn bản của mình rồi nhấn "Tạo chuỗi" thôi. Còn lăn tăn bảng tra gì nữa?

- hoặc chỉ tự gõ hoặc copy/paste từ đâu đó vào TextBox chỉ 4 đoạn văn bản tiếng Việt:
Thẻ tuyệt mật
Nhóm 1
Nước uống có cồn
NƯỚC UỐNG KHÔNG CÓ CỒN


-> nhấn nút "Tạo chuỗi" -> trên C:\ đã có tập tin secret.txt.

Sau đó dán toàn bộ nội dung ở trên, tức <customUI ...> ... </customUI> vào cửa sổ soạn thảo của Custom UI Editor. Tiếp theo thay 4 chỗ "đầu trâu mặt ngựa" bằng 4 đoạn từ secret.txt.

Thế thôi.

Nếu có thêm câu hỏi thì tôi chỉ trả lời khi thỏa 2 điều kiện:
1. Trình bầy cụ thể, chi tiết. Tôi không muốn mất thời gian không cần thiết.
2. Đính kèm tập tin Excel. Diễn đàn này không phải là diễn đàn cho những người hâm mộ chụp ảnh.

Nếu còn muốn trình bầy chung chung thì hãy trích và hỏi người khác.

Khi gõ mà dùng Unikey thì chọn mã Unicode.
 
Lần chỉnh sửa cuối:
Ở bài #15 tôi viết

Nhưng bạn không nói cụ thể nên tôi mất công viết bài #17.
Bây giờ bạn cũng không viết cụ thể.

1. Trong ảnh đính kèm bạn thấy cái gì "không được"?

2. Bạn viết


"không đủ chữ"? Ý là gì?

3. Cách dùng tập tin "Tao chuoi cho Custom UI Editor.xlsm"
Giả sử bạn muốn có nội dung"

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon>
<tabs>
<tab id="MyCustomTab" label="Thẻ tuyệt mật" insertAfterMso="TabHome">
<group id="customGroup1" label="Nhóm 1">
<button id="customButton1" label="Nước uống có cồn" size="normal" onAction="Macro1" />
<separator id="MySeparator1" />
<button id="customButton2" label="NƯỚC UỐNG KHÔNG CÓ CỒN" size="large" onAction="Macro2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>


- Tạo tập tin XLSM, vd. Book1.xlsm -> lưu lại rồi đóng tập tin

- mở tập tin "Tao chuoi cho Custom UI Editor.xlsm" -> nhấn nút "Tạo chuỗi cho Custom UI Editor"
Tiếp theo:

- hoặc tự gõ toàn bộ nội dung kể trên vào TextBox hoặc viết ở đâu đó, vd. Notepad, rồi copy/paste vào TextBox -> nhấn nút "Tạo chuỗi" -> trên C:\ đã có tập tin secret.txt. Không phải tìm bảng tra gì cả. -> mở tập tin secret.txt và copy toàn bộ -> mở Custom UI Editor -> mở Book1.xlsm -> dán nội dung đã copy từ secret.txt vào cửa sổ soạn thảo của Custom UI Editor.

- hoặc chỉ tự gõ hoặc copy/paste từ đâu đó vào TextBox chỉ 4 đoạn văn bản tiếng Việt:
Thẻ tuyệt mật
Nhóm 1
Nước uống có cồn
NƯỚC UỐNG KHÔNG CÓ CỒN


-> nhấn nút "Tạo chuỗi" -> trên C:\ đã có tập tin secret.txt.

Sau đó dán toàn bộ nội dung ở trên, tức <customUI ...> ... </customUI> vào cửa sổ soạn thảo của Custom UI Editor. Tiếp theo thay 4 chỗ "đầu trâu mặt ngựa" bằng 4 đoạn từ secret.txt.

Thế thôi.

Nếu có thêm câu hỏi thì tôi chỉ trả lời khi thỏa 2 điều kiện:
1. Trình bầy cụ thể, chi tiết. Tôi không muốn mất thời gian không cần thiết.
2. Đính kèm tập tin Excel. Diễn đàn này không phải là diễn đàn cho những người hâm mộ chụp ảnh.

Nếu còn muốn trình bầy chung chung thì hãy trích và hỏi người khác.

Khi gõ mà dùng Unikey thì chọn mã Unicode.
Xin lỗi đã làm phiền bạn nhe, vì mình chỉ ko làm được là đánh tiếng việt thôi. Cám ơn bạn đã nhiệt tình giải thích
Bài đã được tự động gộp:

File bạn mở lên bị thế này. Không biết bị lỗi gì
218942
 
Xin lỗi đã làm phiền bạn nhe, vì mình chỉ ko làm được là đánh tiếng việt thôi. Cám ơn bạn đã nhiệt tình giải thích
Bạn dùng Unikey chắc chắn gõ được tiếng Việt. Sau đó chỉ cần nhấn "Tạo chuỗi" rồi copy nội dung của secret.txt thôi. Quá đơn giản.
File bạn mở lên bị thế này. Không biết bị lỗi gì
Xóa toàn bộ Module1 vì không dùng đến. Chuyện lỗi là do code chỉ viết cho 32 bit thôi. Nhưng Module1 là không cần thiết -> Xóa
 
Lần chỉnh sửa cuối:
nó lỗi không làm được
218943
Bài đã được tự động gộp:

Cám ơn batman1 rất nhiều nhe mình làm được rồi.
 
Trước tiên vài lời về cấu trúc nội dung mà ta sẽ phải soạn thảo.
Nội dung bắt đầu bằng 2 thẻ:
Mã:
<customUI xmlns="[URL]http://schemas.microsoft.com/office/2006/01/customui[/URL]" >
<ribbon>
và kết thúc bằng
Mã:
</ribbon>
</customUI>
Phần trên là bắt buộc. Mọi cái ta thêm vào thì ta viết trong thẻ:
Mã:
<ribbon>
...
</ribbon>
Tiếp theo nếu ta muốn thêm menu vào nút Office thì ta phài có thẻ
Mã:
<officeMenu>
...
</officeMenu>
Còn nếu ta muốn thêm vào thẻ có sẵn hoặc tạo thẻ mới thì ta phải có thẻ
Mã:
<tabs>
...
</tabs>
Và trong thẻ đó ta phải có "bằng này" thẻ
Mã:
<tab>
...
</tab>
nếu ta muốn thêm menu vào "bằng này" thẻ có sẵn - tạo mới.
Trong mỗi thẻ
Mã:
<officeMenu>
...
</officeMenu>
hoặc
<tab>
...
</tab>
thì nội dung tùy thuộc vào menu mà ta định thêm vào. Mục menu đơn? Nhóm menu? v...v
Tôi đã soạn hình như là đủ mọi kiểu menu.
Tóm lại cấu trúc của văn bản soạn cho Custom UI Editor là:
Mã:
<customUI xmlns="[URL]http://schemas.microsoft.com/office/2006/01/customui[/URL]" >
<ribbon>
<officeMenu>
...
</officeMenu>
<tabs>
<tab>
...
</tab>
...
<tab>
...
</tab>
</tabs>
</ribbon>
</customUI>

Trong ví dụ đính kèm tôi gộp cả 3 loại ví dụ. Tức thêm menu "ở mọi nơi"

--------------------
Một trong các cách thêm các nút lệnh, trình đơn vào trong dải menu của Excel là cách dùng nội dung XML. Cách làm như sau:

1. Cần tải về và cài đặt Custom UI Editor. Tôi cũng đã đính kèm Custom UI Editor ở dưới
Trước khi cài có thể cần cài .NET framework ≥ 3

2. Soạn nội dung mà ta sẽ phải dán vào cửa sổ của Custom UI Editor
Tùy theo việc ta định làm gì mà nội dung khác nhau. Sau đây là 3 nội dung ví dụ:

a. Thêm nút hoặc menu vào Backstage hoặc nút Office. Nội dung:
<!-- Thêm mục mới trong danh sách menu hiển thị sau khi nhấn vào nút Office. Nội dung được thêm vào tập tin chan_dai.xlsm -->
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<!-- Thêm 1 nút và 1 menu có 7 lựa chọn vào menu của Excel trong nút Office-->
<!-- Thêm 1 nút vào menu Print của Excel và thêm 1 nút vào menu Prepare-->
<!-- chú ý cách dùng &amp; để gạch dưới một chữ cái trong tên của menu -->

<ribbon>
<officeMenu>
<!-- Thêm 1 nút vào menu -->
<button id="customButton1" label="&amp;Nút của tôi" onAction="Macro1" imageMso="DirectRepliesTo" />
<!-- Thêm 1 nút và 1 menu có 7 lựa chọn vào menu của Excel -->
<menu id="MyDropdownMenu" label="&amp;Trình đơn của tôi" imageMso="HappyFace" >
<button id="customButton2" label="Nút thứ 2" onAction="Macro2" imageMso="TextAlignGallery" />
<button id="customButton3" label="Nút thứ 3" onAction="Macro3" imageMso="TextAlignGallery" />
<button id="customButton4" label="Nút thứ 4" onAction="Macro4" imageMso="TextAlignGallery" />
<button id="customButton5" label="Nút thứ 5" onAction="Macro5" imageMso="TextAlignGallery" />
<button id="customButton6" label="Nút thứ 6" onAction="Macro6" imageMso="TextAlignGallery" />
<button id="customButton7" label="Nút thứ 7" onAction="Macro7" imageMso="TextAlignGallery" />
<button id="customButton8" label="Nút thứ 8" onAction="Macro8" imageMso="TextAlignGallery" />
</menu>
<!-- Thêm 1 nút vào menu Print của Excel -->
<splitButton idMso="FilePrintMenu">
<menu>
<button id="customButton9" label="Nút thứ 9" onAction="Macro9" imageMso="FilePrint" description="Miêu tả gì đó"/>
</menu>
</splitButton>
<!-- Thêm 1 nút vào menu Prepare của Excel -->
<menu idMso="FilePrepareMenu">
<button id="customButton10" label="Nút thứ 10" onAction="Macro10" imageMso="HappyFace" description="Một chút miêu tả"/>
</menu>
</officeMenu>
</ribbon>
</customUI>

b. Thêm nút hoặc menu vào thẻ có sẵn của Excel. Nội dung:
<!-- Thêm nút hoặc menu vào một thẻ nào đó, vd. thẻ Home -->

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

<ribbon>
<tabs>
<!-- thêm 1 nhóm gồm 3 nút và menu có 5 mục vào thẻ Home -->
<tab idMso="TabHome" >
<group id="customGroup1" label="Nhóm gì đó" insertAfterMso="GroupEditingExcel" >
<button id="customButton1" label="Nút thứ 1" size="normal" onAction="Macro1" imageMso="DirectRepliesTo" />
<button id="customButton2" label="Nút thứ 2" size="normal" onAction="Macro2" imageMso="AccountMenu" />
<button id="customButton3" label="Nút thứ 3" size="normal" onAction="Macro3" imageMso="RegionLayoutMenu" />
<separator id="MySeparator1" />
<menu id="MyDropdownMenu" label="Menu của riêng tôi" size="large" imageMso="TextAlignGallery" >
<button id="customButton4" label="Nút thứ 4" onAction="Macro4" imageMso="TextAlignGallery" />
<button id="customButton5" label="Nút thứ 5" onAction="Macro5" imageMso="TextAlignGallery" />
<button id="customButton6" label="Nút thứ 6" onAction="Macro6" imageMso="TextAlignGallery" />
<button id="customButton7" label="Nút thứ 7" onAction="Macro7" imageMso="TextAlignGallery" />
<button id="customButton8" label="Nút thứ 8" onAction="Macro8" imageMso="TextAlignGallery" />
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

c. Thêm thẻ mới vào Ribbon. Nội dung:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<!-- Thêm thẻ mới vào Ribbon -->
<ribbon>
<tabs>
<tab id="MyCustomTab" label="Thẻ riêng của tôi" insertAfterMso="TabHome">
<!-- thêm nhóm gồm 2 nút -->
<group id="customGroup1" label="Nhóm thứ 1">
<button id="customButton1" label="Nút thứ 1" size="normal" onAction="Macro1" imageMso="PrintPreviewShrinkOnePage" />
<separator id="MySeparator1" />
<button id="customButton2" label="Nút thứ 2" size="large" onAction="Macro2" imageMso="ReviewPreviousComment" />
</group>
<!-- thêm nhóm gồm menu có 2 nút -->
<group id="customGroup2" label="Nhóm thứ 2">
<menu id="MyDropdownMenu" label="Menu của tôi" size="large" imageMso="TextAlignGallery" >
<button id="customButton3" label="Nút thứ 3" onAction="Macro3" imageMso="TextAlignGallery" />
<button id="customButton4" label="Nút thứ 4" onAction="Macro4" imageMso="TextAlignGallery" />
</menu>
</group>
<!-- thêm nhóm gồm splitButton trong đó có 1 nút và 1 menu có 2 nút -->
<group id="customGroup3" label="Nhóm thứ 3">
<splitButton id="mySplitButton" size="large">
<button id="customButton5" imageMso="HappyFace" label="Nút thứ 5" supertip="Đây là splitButton." onAction="Macro5"/>
<menu id="splitMenu" itemSize="large">

<button id="customButton6" imageMso="FormatPainter" label="Nút thứ 6" onAction="Macro6" description="Miêu tả gì đó"/>
<button id="customButton7" imageMso="FormatPainter" label="Nút thứ 7" onAction="Macro7" description="Miêu tả nhé"/>
</menu>
</splitButton>
</group>
<!-- thêm nhóm gồm 2 cụm nút, mỗi cụm 2 nút -->
<group id="customGroup4" label="Nhóm thứ 4">
<buttonGroup id="mybuttonGroup1">
<button id="customButton8" label="Nút thứ 8" showLabel="false" onAction="Macro8" imageMso="ReviewPreviousComment" />
<button id="customButton9" label="Nút thứ 9" showLabel="false" onAction="Macro9" imageMso="ReviewPreviousComment" />
</buttonGroup>
<buttonGroup id="mybuttonGroup2">
<button id="customButton10" label="Nút thứ 10" showLabel="false" onAction="Macro10" imageMso="HappyFace" />
<button id="customButton11" label="Nút thứ 11" showLabel="false" onAction="Macro11" imageMso="HappyFace" />
</buttonGroup>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

3. Các bước thực hiện
a. Mở Excel --> lưu lại với tên vd. chan_dai.xlsm --> đóng Excel

b.

View attachment 92948



Mở Custom UI Editor --> mởi tập tin chan_dai.xlsm vừa lưu --> chuột phải vào chan_dai.xlsm và chọn "Office 2007 (2010) Custom UI Part --> dán nội dung ở phần 2 vào cửa sổ bên phải --> nhấn nút cuối cùng trên dải menu (Generate Callbacks) --> bôi đen nội dung vừa được tạo ra và dán vào bộ nhớ đệm (Ctrl + C) --> click vào chan_dai.xlsm ở nửa trái để hiển thị lại nội dung viết ở phần 2 --> lưu lại tập tin chan_dai.xlsm --> đóng Custom UI Editor
Chú ý: Khi mở Excel thì Excel xóa clipboard nên hoặc ta mở Excel xong rồi mới dán vào clipboard hoặc dán vào clipboard rồi từ đó dán tạm thời vào notepad rồi mở Excel.

c. Mở Excel --> mở tập tin chan_dai.xlsm --> ta đã thấy có menu mà ta thêm vào. Nhưng nhấn chuột vào thì chưa có gì, thậm chí Excel thông báo lỗi, vì ta chưa viết code để gán cho các nút ta thêm vào.
Nhấn Alt + F11 để mở VBA. Nhấn Insert --> Module để thêm môđun --> Dán code đã lưu vào bộ nhớ đệm ở điểm b (Ctrl + V) --> bổ sung code để phục vụ các nút.
Chọn save để lưu lại chan_dai.xlsm

d. Nếu chan_dai.xlsm ta định làm addin thì ta làm như sau:
Trong cửa sổ VBA ta nhấn vào ThisWorkbook --> chuyển IsAddin sang TRUE --> chọn save --> VBA chỉ cho phép ta lưu lại thành chan_dai.xlam.
chan_dai.xlam ta thêm vào Add_ins để mỗi lần mở Excel là có.
Chào các bạn
Tôi muốn thêm menu trên excel 2010
Ở bài 7 tôi đã thêm được Menu (xem hình)nó nằm trong Menu Home
1571121493908.png
Cũng đã tạo được Addin chan_dai.xlsm
Khi nhấn Nút thứ 1 thì nó ra hình dưới
1571121519750.png
Và thấy code trong module1:
'Callback for customButton1 onAction
Sub Macro1(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton21 onAction
Sub Macro2(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton24 onAction
Sub Macro3(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton25 onAction
Sub Macro4(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton28 onAction
Sub Macro5(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton31 onAction
Sub Macro6(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton42 onAction
Sub Macro7(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton44 onAction
Sub Macro8(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton36 onAction
Sub Macro9(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton38 onAction
Sub Macro10(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton40 onAction
Sub Macro11(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton22 onAction
Sub Macro12(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton46 onAction
Sub Macro13(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton26 onAction
Sub Macro14(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton29 onAction
Sub Macro15(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton32 onAction
Sub Macro16(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton43 onAction
Sub Macro17(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton45 onAction
Sub Macro18(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton41 onAction
Sub Macro19(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton23 onAction
Sub Macro20(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton47 onAction
Sub Macro21(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton27 onAction
Sub Macro22(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton30 onAction
Sub Macro23(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton33 onAction
Sub Macro24(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton34 onAction
Sub Macro25(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton35 onAction
Sub Macro26(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton37 onAction
Sub Macro27(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton39 onAction
Sub Macro28(control As IRibbonControl)
MsgBox control.ID
End Sub
'Callback for customButton20 onAction
Sub Macro29(control As IRibbonControl)
MsgBox control.ID
End Sub

Bây giờ tôi muốn đưa 1 đoạn code ở dưới vào để tạo addin
Sub DelObjects()
Dim i As Long, wks As Worksheet
On Error Resume Next
Set wks = ActiveSheet
For i = 1 To 10000
wks.Shapes(1).Delete
Next
MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
(1)Đưa code vào chỗ nào để bấm vào nút thứ 1 thì nó chạy code?
(2)Muốn đổi tên “Nút thứ 1” thành “DelObjects” thì đổi như thế nào?
(3)Trong mục “Menu của riêng tôi” nó có 5 nút từ Nút thứ 4 -> Nút thứ 8: Nếu tôi muốn thêm các nút thì thế nào ạ?
Tôi đã đọc các bài của mục này nhưng vẫn chưa biết làm,
Xin các bạn hướng dẫn tôi chi tiết vì tôi không biết nhiều về máy tính
Xin cảm ơn các bạn
 
Khi nhấn Nút thứ 1 thì nó ra hình dưới
View attachment 226667
Bạn đang nói tới menu được tạo bởi nội dung sau trong XML
<group id="customGroup1" label="Nho&#769;m gi&#768; &#273;o&#769;" insertAfterMso="GroupEditingExcel" >
<button id="customButton40" label="Nu&#769;t th&#432;&#769; 1" size="normal" onAction="Macro11" imageMso="DirectRepliesTo" />
<button id="customButton22" label="Nu&#769;t th&#432;&#769; 2" size="normal" onAction="Macro12" imageMso="AccountMenu" />
<button id="customButton46" label="Nu&#769;t th&#432;&#769; 3" size="normal" onAction="Macro13" imageMso="RegionLayoutMenu" />

<separator id="MySeparator1" />

<menu id="MyDropdownMenu2" label="Menu cu&#777;a ri&#234;ng t&#244;i" size="large" imageMso="TextAlignGallery" >
<button id="customButton26" label="Nu&#769;t th&#432;&#769; 4" onAction="Macro14" imageMso="TextAlignGallery" />
<button id="customButton29" label="Nu&#769;t th&#432;&#769; 5" onAction="Macro15" imageMso="TextAlignGallery" />
<button id="customButton32" label="Nu&#769;t th&#432;&#769; 6" onAction="Macro16" imageMso="TextAlignGallery" />
<button id="customButton43" label="Nu&#769;t th&#432;&#769; 7" onAction="Macro17" imageMso="TextAlignGallery" />
<button id="customButton45" label="Nu&#769;t th&#432;&#769; 8" onAction="Macro18" imageMso="TextAlignGallery" />
</menu>
</group>
</tab>

Trong code trên có đoạn
<button id="customButton40" label="Nu&#769;t th&#432;&#769; 1" size="normal" onAction="Macro11" imageMso="DirectRepliesTo" />
Tức sẽ có nút có id là "customButton40", hiển thị là "Nút thứ 1", mà khi click nó thì sẽ chạy Macro "Macro11"

Tức khi click "Nút thứ 1" thì chạy
Mã:
'Callback for customButton40 onAction
Sub Macro11(control As IRibbonControl)
    MsgBox control.ID
End Sub
Và thấy code trong module1:
...
'Callback for customButton40 onAction
Sub Macro11(control As IRibbonControl)
MsgBox control.ID
End Sub
...
Bây giờ tôi muốn đưa 1 đoạn code ở dưới vào để tạo addin
Sub DelObjects()
Dim i As Long, wks As Worksheet
On Error Resume Next
Set wks = ActiveSheet
For i = 1 To 10000
wks.Shapes(1).Delete
Next
MsgBox "Còn " & wks.Shapes.Count & " objects"
End Sub
(1)Đưa code vào chỗ nào để bấm vào nút thứ 1 thì nó chạy code?
MsgBox chỉ là ví dụ về code. Trong tập tin thực thì thay MsgBox control.ID bằng code của mình thôi.
Mã:
'Callback for customButton40 onAction
Sub Macro11(control As IRibbonControl)
    DelObjects
End Sub
(2)Muốn đổi tên “Nút thứ 1” thành “DelObjects” thì đổi như thế nào?
Trong code trên có đoạn
label="Nu&#769;t th&#432;&#769; 1"
Vậy thì đổi thành
Mã:
label="DelObjects"
(3)Trong mục “Menu của riêng tôi” nó có 5 nút từ Nút thứ 4 -> Nút thứ 8: Nếu tôi muốn thêm các nút thì thế nào ạ?
Lấy ví dụ nút 4
<button id="customButton26" label="Nu&#769;t th&#432;&#769; 4" onAction="Macro14" imageMso="TextAlignGallery" />

Nhìn kỹ thì thấy 5 nút đều có dạng
<button id="chuỗi định danh nào đó. ID phải là duy nhất trong XML" label="Nhãn hiệu hiển thị trên nút" onAction="Têm macro sẽ được thực thi khi nút được nhấn" imageMso="Một image nào đó" />

Ví dụ bạn muốn thêm nút và gán cho nó ID là "secretButton", hiển thị là "My secret button" mà khi nhấn thì thực thi macro "DoSecretOperation", và có icon là "mặt cười" thì code là
<button id="secretButton" label="My secret button" onAction="DoSecretOperation" imageMso="HappyFace" />

Tức bạn phải: lưu rồi đóng tập tin chan_dai_xlsm -> mở Custom UI Editor -> chọn mở tập tin chan_dai.xlsm -> thêm code ở trên -> nhấn save -> nhấn "Generate Callbacks"

Bạn sẽ thấy ngoài các callback đã có trước thì bây giờ Custom UI Editor tạo hộ bạn callback
Mã:
'Callback for secretButton onAction
Sub DoSecretOperation(control As IRibbonControl)

End Sub

Đóng Custom UI Editor -> mở chan_dai.xlsm -> vào VBE -> thêm callback ở trên -> viết code trong sub DoSecretOperation
 
Cảm ơn sự hướng dẫn tận tình của bạn
Ở bài trên bạn có nói:
Bạn đang nói tới menu được tạo bởi nội dung sau trong XML
Tôi thực sự không biết file XML này ở đâu & mở nó = cái gì? vì code trong File Chân dài chỉ có 1 module1 (đã nói ở trên)
Ở bài 7 của bạn Tôi chỉ biết tải 2 file nén về, rồi chạy OfficeCustomUIEditor.msi
Rồi chạy file chan_dai.xlsm sau đó chọn file này làm addin
 
Nói tóm lại là tìm XML ở đâu để chỉnh trong đó, đó bác!
 
Nói tóm lại là tìm XML ở đâu để chỉnh trong đó, đó bác!
Như thường lệ tôi viết rất kỹ, nắm tay dẫn đi từng bước, mất rất nhiều thời gian. Nhưng người khác không chịu đọc. Tiếc thời gian của mình? Thời gian của người khác thì không tiếc?

Trích bài #7
Mở Custom UI Editor --> mởi tập tin chan_dai.xlsm vừa lưu --> chuột phải vào chan_dai.xlsm và chọn "Office 2007 (2010) Custom UI Part --> dán nội dung ở phần 2 vào cửa sổ bên phải --> nhấn nút cuối cùng trên dải menu (Generate Callbacks) --> bôi đen nội dung vừa được tạo ra và dán vào bộ nhớ đệm (Ctrl + C) --> click vào chan_dai.xlsm ở nửa trái để hiển thị lại nội dung viết ở phần 2 --> lưu lại tập tin chan_dai.xlsm --> đóng Custom UI Editor
...
Một trong các cách thêm các nút lệnh, trình đơn vào trong dải menu của Excel là cách dùng nội dung XML. Cách làm như sau:

1. Cần tải về và cài đặt Custom UI Editor. Tôi cũng đã đính kèm Custom UI Editor ở dưới
Trước khi cài có thể cần cài .NET framework ≥ 3

2. Soạn nội dung mà ta sẽ phải dán vào cửa sổ của Custom UI Editor

Trích bài #24
Tức bạn phải: lưu rồi đóng tập tin chan_dai_xlsm -> mở Custom UI Editor -> chọn mở tập tin chan_dai.xlsm -> thêm code ở trên -> nhấn save -> nhấn "Generate Callbacks"

Xem
chandai.JPG
 
Mới đầu mình cũng mò cũng không biết làm sao để mở ? Sau khi đã mò ra thì cũng không dùng nữa hihi. Thấy bạn hỏi mình nhớ lại mình khi xưa hihihi
 
Mới đầu mình cũng mò cũng không biết làm sao để mở ? Sau khi đã mò ra thì cũng không dùng nữa hihi. Thấy bạn hỏi mình nhớ lại mình khi xưa hihihi
Nhưng bạn không biết mở cái gì?
Tôi viết rất rõ
Mở Custom UI Editor --> mởi tập tin chan_dai.xlsm vừa lưu
Custom UI Editor là một chương trình. "Mở Paint, mở notepad, mở Excel, mở Word, mở Delphi " bạn có hiểu không? Nếu hiểu thì tại sao lại không hiểu "mở Custom UI Editor"?

Còn lý luận kiểu: "tôi không biết tìm nó (hàm ý nói về Custom UI Editor) ở đâu" cũng không thuyết phục. Vì khi ai đó nói: Mở Paint, mở notepad, mở Excel, mở Word, mở Delphi, mà bạn biết mở thì chứng tỏ bạn biết phải làm những gì. Vậy tại sao khi tới "mở Custom UI Editor" thì bạn lại không biết gì?

Tóm lại bạn không biết mở cái gì? Và bạn không biết mở do không ai chỉ dẫn hay người ta chỉ dẫn không rõ ràng? Vì tôi nghĩ tôi đã chỉ rất rõ ràng. Bạn không thể bỏ cái ai đó đã không hướng dẫn bạn hoặc hướng dẫn chung chung và cái tôi hướng dẫn cụ thể vào cùng một giuộc được.
 
Hihi ý em nói là lúc mới ai cũng bở ngỡ chứ không phải là bài viết của anh không rõ ràng.
 
batman1 cho hỏi
Muốn thay đổi icon thì có bản danh sách nào để đổi không, cảm ơn bạn
 
Thầy @batman1 ơi, sao em có bắt chước làm Menu Ribbon với đoạn code này:
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon startFromScratch="true">
</ribbon>
    <backstage>  
        <button idMso="FileSave" visible="true"/>
        <button idMso="FileSaveAs" visible="false"/>
        <button idMso="FileOpen" visible="false"/>
        <button idMso="FileClose" visible="false"/>
        <button idMso="ApplicationOptionsDialog" visible="false"/>
        <button idMso="FileExit" visible="false"/>
        <button idMso="HistoryTab" visible="false"/>
        <button idMso="OfficeFeedback" visible="false"/>
        <button idMso="FileSave" visible="false"/>
        <tab idMso="TabInfo" visible="false"/>
        <tab idMso="TabRecent" visible="false"/>
        <tab idMso="TabNew" visible="false"/>
        <tab idMso="TabPrint" visible="false"/>
        <tab idMso="TabShare" visible="false"/>
        <tab idMso="TabHelp" visible="false"/>
        <tab idMso="TabPublish" visible="false"/>
        <tab idMso="TabSave" visible="false"/>      
        <tab idMso="TabOfficeStart" visible="false"/>
    <tab idMso="Publish2Tab" visible="false"/>
    <tab idMso="TabOfficeFeedback" visible="false"/>
    </backstage>
<tabs>  
<tab id="tabQLCongViec" label="Qu&#7843;n l&#253; c&#244;ng vi&#7879;c" visible="true">
<group id="NghiepVuNXT" label="Nghi&#7879;p V&#7909; NXT">
<button id="frmPhieuNhap" label="Nh&#7853;p Ph&#7909; Li&#7879;u" onAction="Macro1" imageMso="TableRowsInsertAboveWord" />
<button id="frmPhieuXuat" label="Xu&#7845;t Ph&#7909; Li&#7879;u" onAction="Moacro2" imageMso="TableRowsInsertBelowWord" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
thì khi nhấn CallBacks thì báo lỗi dòng 34 vị trí số 3 ạ. mong Thầy xem dùm em ạ.
 
Thầy @batman1 ơi, sao em có bắt chước làm Menu Ribbon với đoạn code này:
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon startFromScratch="true">
</ribbon>
    <backstage> 
        <button idMso="FileSave" visible="true"/>
        <button idMso="FileSaveAs" visible="false"/>
        <button idMso="FileOpen" visible="false"/>
        <button idMso="FileClose" visible="false"/>
        <button idMso="ApplicationOptionsDialog" visible="false"/>
        <button idMso="FileExit" visible="false"/>
        <button idMso="HistoryTab" visible="false"/>
        <button idMso="OfficeFeedback" visible="false"/>
        <button idMso="FileSave" visible="false"/>
        <tab idMso="TabInfo" visible="false"/>
        <tab idMso="TabRecent" visible="false"/>
        <tab idMso="TabNew" visible="false"/>
        <tab idMso="TabPrint" visible="false"/>
        <tab idMso="TabShare" visible="false"/>
        <tab idMso="TabHelp" visible="false"/>
        <tab idMso="TabPublish" visible="false"/>
        <tab idMso="TabSave" visible="false"/>     
        <tab idMso="TabOfficeStart" visible="false"/>
    <tab idMso="Publish2Tab" visible="false"/>
    <tab idMso="TabOfficeFeedback" visible="false"/>
    </backstage>
<tabs> 
<tab id="tabQLCongViec" label="Qu&#7843;n l&#253; c&#244;ng vi&#7879;c" visible="true">
<group id="NghiepVuNXT" label="Nghi&#7879;p V&#7909; NXT">
<button id="frmPhieuNhap" label="Nh&#7853;p Ph&#7909; Li&#7879;u" onAction="Macro1" imageMso="TableRowsInsertAboveWord" />
<button id="frmPhieuXuat" label="Xu&#7845;t Ph&#7909; Li&#7879;u" onAction="Moacro2" imageMso="TableRowsInsertBelowWord" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
thì khi nhấn CallBacks thì báo lỗi dòng 34 vị trí số 3 ạ. mong Thầy xem dùm em ạ.
Bạn bắt chước cái anh đi Ma da gì đó hả?

Bạn có 2 lần thẻ </ribbon>: ở dòng 3 và dòng trước cuối. Xóa dòng trước cuối đi.
 
Em xóa dòng trước cuối thì hiện bảng này Thầy ơi"
Untitled.pngUntitled.png
 
Lần chỉnh sửa cuối:
Em xóa dòng trước cuối thì hiện bảng này Thầy ơi"
Nếu bạn dùng Excel 2007 thì phải là
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

Nói chung nếu bạn muốn tập tin mở cả trên Excel 2007 và mới hơn thì nên đính kèm 2 phiên bản XML: customUI14.xml và customUI.xml

custom.JPG

Chính xác là như sau:

customUI14.xml

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="true">
<contextualTabs>
<tabSet idMso="TabSetSmartArtTools" visible="false" />
<tabSet idMso="TabSetChartTools" visible="false" />
<tabSet idMso="TabSetDrawingTools" visible="false" />
<tabSet idMso="TabSetPictureTools" visible="false" />
<tabSet idMso="TabSetPivotTableTools" visible="false" />
<tabSet idMso="TabSetHeaderAndFooterTools" visible="false" />
<tabSet idMso="TabSetTableToolsExcel" visible="false" />
<tabSet idMso="TabSetPivotChartTools" visible="false" />
<tabSet idMso="TabSetInkTools" visible="false" />
</contextualTabs>
</ribbon>
<backstage>
<button idMso="FileSave" visible="false"/>
<button idMso="FileSaveAs" visible="false"/>
<button idMso="FileOpen" visible="false"/>
<button idMso="FileClose" visible="false"/>
<button idMso="ApplicationOptionsDialog" visible="false"/>
<button idMso="FileExit" visible="false"/>
<tab idMso="TabInfo" visible="false"/>
<tab idMso="TabRecent" visible="false"/>
<tab idMso="TabNew" visible="false"/>
<tab idMso="TabPrint" visible="false"/>
<tab idMso="TabShare" visible="false"/>
<tab idMso="TabHelp" visible="false"/>
</backstage>
</customUI>


customUI.xml

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<commands>
<command idMso="ApplicationOptionsDialog" enabled="false"/>
<command idMso="FileExit" enabled="false"/>
</commands>
<ribbon startFromScratch="true">
<officeMenu>
<button idMso="FileNew" visible="false"/>
<button idMso="FileOpen" visible="false"/>
<button idMso="FileSave" visible="false" />
</officeMenu>
<contextualTabs>
<tabSet idMso="TabSetSmartArtTools" visible="false" />
<tabSet idMso="TabSetChartTools" visible="false" />
<tabSet idMso="TabSetDrawingTools" visible="false" />
<tabSet idMso="TabSetPictureTools" visible="false" />
<tabSet idMso="TabSetPivotTableTools" visible="false" />
<tabSet idMso="TabSetHeaderAndFooterTools" visible="false" />
<tabSet idMso="TabSetTableToolsExcel" visible="false" />
<tabSet idMso="TabSetPivotChartTools" visible="false" />
<tabSet idMso="TabSetInkTools" visible="false" />
</contextualTabs>
</ribbon>
</customUI>
-------

Giải thích cho bạn là tại sao ở đây có thêm thẻ <contextualTabs> mà bạn không có

Giả sử không có dòng

<tabSet idMso="TabSetPictureTools" visible="false" />

Lúc đó nếu trên sheet bạn có ảnh thì khi bạn chọn ảnh thì trên ribbon xuất hiện thẻ "Picture Tools", và trong nó có các mục để bạn thao tác với ảnh. Nễu bạn muốn thế thì xóa dòng trên, ngược lại nếu không muốn xuất hiện "Picture Tools" thì thêm dòng trên.

Nhìn các dòng còn lại của <contextualTabs> thì bạn cũng có thể đoán là khi không có chúng thì những menu nào sẽ xuất hiện trên ribbon và khi nào thì xuất hiện.
--------------------------------
Tóm lại menu tự tạp của bạn sau khi chèn vào customUI14.xml ở trên thì thành

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="true">
<contextualTabs>
<tabSet idMso="TabSetSmartArtTools" visible="false" />
<tabSet idMso="TabSetChartTools" visible="false" />
<tabSet idMso="TabSetDrawingTools" visible="false" />
<tabSet idMso="TabSetPictureTools" visible="false" />
<tabSet idMso="TabSetPivotTableTools" visible="false" />
<tabSet idMso="TabSetHeaderAndFooterTools" visible="false" />
<tabSet idMso="TabSetTableToolsExcel" visible="false" />
<tabSet idMso="TabSetPivotChartTools" visible="false" />
<tabSet idMso="TabSetInkTools" visible="false" />
</contextualTabs>
<tabs>
<tab id="tabQLCongViec" label="Qu&#7843;n l&#253; c&#244;ng vi&#7879;c" visible="true">
<group id="NghiepVuNXT" label="Nghi&#7879;p V&#7909; NXT">
<button id="frmPhieuNhap" label="Nh&#7853;p Ph&#7909; Li&#7879;u" onAction="Macro1" imageMso="TableRowsInsertAboveWord" />
<button id="frmPhieuXuat" label="Xu&#7845;t Ph&#7909; Li&#7879;u" onAction="Moacro2" imageMso="TableRowsInsertBelowWord" />
</group>
</tab>
</tabs>
</ribbon>
<backstage>
<button idMso="FileSave" visible="false"/>
<button idMso="FileSaveAs" visible="false"/>
<button idMso="FileOpen" visible="false"/>
<button idMso="FileClose" visible="false"/>
<button idMso="ApplicationOptionsDialog" visible="false"/>
<button idMso="FileExit" visible="false"/>
<tab idMso="TabInfo" visible="false"/>
<tab idMso="TabRecent" visible="false"/>
<tab idMso="TabNew" visible="false"/>
<tab idMso="TabPrint" visible="false"/>
<tab idMso="TabShare" visible="false"/>
<tab idMso="TabHelp" visible="false"/>
</backstage>
</customUI>
 
Lần chỉnh sửa cuối:
Bạn có 2 lần thẻ </ribbon>: ở dòng 3 và dòng trước cuối. Xóa dòng trước cuối đi.
Em xóa dòng trước cuối thì hiện bảng này Thầy ơi"

Xoá cái thẻ đóng Ribbon </ribbon> ở dòng thứ 3 đi. Mới mở <ribbon startFromScratch="true"> thì đóng mất rồi thì ở dòng kế cuối còn gì mà đóng.
 
Cám ơn !
 
Lần chỉnh sửa cuối:
Bạn đang nói tới menu được tạo bởi nội dung sau trong XML


Trong code trên có đoạn

Tức sẽ có nút có id là "customButton40", hiển thị là "Nút thứ 1", mà khi click nó thì sẽ chạy Macro "Macro11"

Tức khi click "Nút thứ 1" thì chạy
Mã:
'Callback for customButton40 onAction
Sub Macro11(control As IRibbonControl)
    MsgBox control.ID
End Sub

MsgBox chỉ là ví dụ về code. Trong tập tin thực thì thay MsgBox control.ID bằng code của mình thôi.
Mã:
'Callback for customButton40 onAction
Sub Macro11(control As IRibbonControl)
    DelObjects
End Sub

Trong code trên có đoạn

Vậy thì đổi thành
Mã:
label="DelObjects"

Lấy ví dụ nút 4


Nhìn kỹ thì thấy 5 nút đều có dạng


Ví dụ bạn muốn thêm nút và gán cho nó ID là "secretButton", hiển thị là "My secret button" mà khi nhấn thì thực thi macro "DoSecretOperation", và có icon là "mặt cười" thì code là


Tức bạn phải: lưu rồi đóng tập tin chan_dai_xlsm -> mở Custom UI Editor -> chọn mở tập tin chan_dai.xlsm -> thêm code ở trên -> nhấn save -> nhấn "Generate Callbacks"

Bạn sẽ thấy ngoài các callback đã có trước thì bây giờ Custom UI Editor tạo hộ bạn callback
Mã:
'Callback for secretButton onAction
Sub DoSecretOperation(control As IRibbonControl)

End Sub

Đóng Custom UI Editor -> mở chan_dai.xlsm -> vào VBE -> thêm callback ở trên -> viết code trong sub DoSecretOperation
Cho em hỏi anh @batman1 và các anh/chị trên GPE,
Như anh Batman1 có hướng dẫn viết code trên custom UI, việc tạo nút dùng thẻ Button id, tạo menu dùng thẻ menu id...
Nếu em muốn thêm 1 textbox vào Group id, thì code trên custom UI sẽ làm thế nào ạ?
Mục đích: để nhập đường dẫn vào (hoặc có nút Browse chọn đường dẫn đưa vào textbox) xong thực hiện việc lưu file/sheet theo textbox đó.
(ý tưởng như hình vẽ)

z3293985346242_c78255fff60a60864df220c4c0284772.jpg

Cảm ơn các anh/chị.
 
Cho em hỏi anh @batman1 và các anh/chị trên GPE,
Như anh Batman1 có hướng dẫn viết code trên custom UI, việc tạo nút dùng thẻ Button id, tạo menu dùng thẻ menu id...
Nếu em muốn thêm 1 textbox vào Group id, thì code trên custom UI sẽ làm thế nào ạ?
Mục đích: để nhập đường dẫn vào (hoặc có nút Browse chọn đường dẫn đưa vào textbox) xong thực hiện việc lưu file/sheet theo textbox đó.
(ý tưởng như hình vẽ)

View attachment 273650

Cảm ơn các anh/chị.
Nếu bạn tự tạo các thành phần của ribbon thì bạn phải đọc tài liệu. Tốt nhất là đọc ở ngay nguồn, tức trang của bác Bill


editBox.jpg

Bạn có thể dùng editBox. XML cho tập tin đính kèm là:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="RibbonLoad">
<ribbon>
<tabs>
<tab id="MyCustomTab" label="The&#777; ri&#234;ng cu&#777;a t&#244;i" insertAfterMso="TabHome">
<group id="mybox">
<editBox id="editBox1" label="Edit Box" onChange="EditBoxTextChanged" imageMso="HappyFace" tag="group1editBox1" getText="GetEditBoxText"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Tôi giải thích từ A đến Z cho bạn hiểu cách thức hoạt động của editBox.

Khi ribbon cần text để hiển thị trong editBox thì nó sẽ gọi call back getText nếu có. Nhìn XML ở trên thì có getText="GetEditBoxText", và ribbon gọi GetEditBoxText mỗi khi cần text để hiển thị trong editBox. Khi nào ribbon cần hiển thị text trong editBox? Vd. khi bạn chọn thẻ mà mình tạo. Ở thời điểm "chào buổi sáng" thì ribbon phải có text để nhập vào editBox. Vì thế nó sẽ gọi GetEditBoxText. Trong code của GetEditBoxText bạn phải trả về text mà ribbon sẽ hiển thị trong editBox. GetEditBoxText cũng được gọi khi code của bạn gọi InvalidateControl ("editBox1") để làm mới editBox.

Mỗi khi có sự thay đổi trong editBox thì onChange sẽ được thực hiện nếu có. Nhìn ở trên thấy onChange="EditBoxTextChanged" nên mỗi khi nhập gì đó trong editBox rồi click ô nào đó trên sheet (kết thúc nhập trong editBox) hoặc nhấn Button1 trên sheet (kết thúc nhập trong editBox) thì EditBoxTextChanged sẽ được gọi để thực thi. Trong call back EditBoxTextChanged thì tham số text chính là nội dung đang có trong editBox.

Trong ví dụ bạn không thể nhập "thich con gai" được (nhập xong rồi nhấn Button1 hoặc chọn ô bất kỳ trên sheet để ra hiệu là việc nhập editBox đã hoàn tất). Nếu nhập "thich con gai" thì thông báo sẽ hiện ra và editBox được phục hồi về giá trị cuối cùng trước lỗi.

Nhìn code ở dưới thì thấy ở mọi thời điểm thì nội dung trong editBox và currText là như nhau.

Code trong Module1
Mã:
Private rb As IRibbonUI
Public currText As String

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
    currText = "hichic" ' ghi nho noi dung cua editBox o thoi diem "chao buoi sang" trong bien currText
End Sub

'Callback for editBox1 onChange
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
'    khong cho phep nhap "thich con gai". Neu cau nay duoc nhap thi noi dung cu se duoc phuc hoi
    If text <> "thich con gai" Then
        currText = text
    Else
        MsgBox "thich con gai la cau noi bi cam. Khong duoc phep nhe!" ' thong bao lenh cam
        rb.InvalidateControl ("editBox1")   ' goi InvalidateControl cho editBox1 nen GetEditBoxText se duoc goi de thuc hien
    End If
End Sub

'Callback for editBox1 getText
Sub GetEditBoxText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = currText  ' lay currText de lam nguon nhap vao, lam moi editBox
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Nếu bạn tự tạo các thành phần của ribbon thì bạn phải đọc tài liệu. Tốt nhất là đọc ở ngay nguồn, tức trang của bác Bill


View attachment 273653

Bạn có thể dùng editBox. XML cho tập tin đính kèm là:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="RibbonLoad">
<ribbon>
<tabs>
<tab id="MyCustomTab" label="The&#777; ri&#234;ng cu&#777;a t&#244;i" insertAfterMso="TabHome">
<group id="mybox">
<editBox id="editBox1" label="Edit Box" onChange="EditBoxTextChanged" imageMso="HappyFace" tag="group1editBox1" getText="GetEditBoxText"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Tôi giải thích từ A đến Z cho bạn hiểu cách thức hoạt động của editBox.

Khi ribbon cần text để hiển thị trong editBox thì nó sẽ gọi call back getText nếu có. Nhìn XML ở trên thì có getText="GetEditBoxText", và ribbon gọi GetEditBoxText mỗi khi cần text để hiển thị trong editBox. Khi nào ribbon cần hiển thị text trong editBox? Vd. khi bạn chọn thẻ mà mình tạo. Ở thời điểm "chào buổi sáng" thì ribbon phải có text để nhập vào editBox. Vì thế nó sẽ gọi GetEditBoxText. Trong code của GetEditBoxText bạn phải trả về text mà ribbon sẽ hiển thị trong editBox. GetEditBoxText cũng được gọi khi code của bạn gọi InvalidateControl ("editBox1") để làm mới editBox.

Mỗi khi có sự thay đổi trong editBox thì onChange sẽ được thực hiện nếu có. Nhìn ở trên thấy onChange="EditBoxTextChanged" nên mỗi khi nhập gì đó trong editBox rồi click ô nào đó trên sheet (kết thúc nhập trong editBox) hoặc nhấn Button1 trên sheet (kết thúc nhập trong editBox) thì EditBoxTextChanged sẽ được gọi để thực thi. Trong call back EditBoxTextChanged thì tham số text chính là nội dung đang có trong editBox.

Trong ví dụ bạn không thể nhập "thich con gai" được (nhập xong rồi nhấn Button1 hoặc chọn ô bất kỳ trên sheet để ra hiệu là việc nhập editBox đã hoàn tất). Nếu nhập "thich con gai" thì thông báo sẽ hiện ra và editBox được phục hồi về giá trị cuối cùng trước lỗi.

Nhìn code ở dưới thì thấy ở mọi thời điểm thì nội dung trong editBox và currText là như nhau.

Code trong Module1
Mã:
Private rb As IRibbonUI
Public currText As String

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
    currText = "hichic" ' ghi nho noi dung cua editBox o thoi diem "chao buoi sang" trong bien currText
End Sub

'Callback for editBox1 onChange
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
'    khong cho phep nhap "thich con gai". Neu cau nay duoc nhap thi noi dung cu se duoc phuc hoi
    If text <> "thich con gai" Then
        currText = text
    Else
        MsgBox "thich con gai la cau noi bi cam. Khong duoc phep nhe!" ' thong bao lenh cam
        rb.InvalidateControl ("editBox1")   ' goi InvalidateControl cho editBox1 nen GetEditBoxText se duoc goi de thuc hien
    End If
End Sub

'Callback for editBox1 getText
Sub GetEditBoxText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = currText  ' lay currText de lam nguon nhap vao, lam moi editBox
End Sub
Em cảm ơn anh @batman1, rất tuyệt vời. Em sẽ thử thực hành xem sao ạ.
 
Nếu bạn tự tạo các thành phần của ribbon thì bạn phải đọc tài liệu. Tốt nhất là đọc ở ngay nguồn, tức trang của bác Bill


View attachment 273653

Bạn có thể dùng editBox. XML cho tập tin đính kèm là:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="RibbonLoad">
<ribbon>
<tabs>
<tab id="MyCustomTab" label="The&#777; ri&#234;ng cu&#777;a t&#244;i" insertAfterMso="TabHome">
<group id="mybox">
<editBox id="editBox1" label="Edit Box" onChange="EditBoxTextChanged" imageMso="HappyFace" tag="group1editBox1" getText="GetEditBoxText"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Chào anh @batman1 và các anh/chị,

Ngay dòng đầu của Code Xml để tạo Ribbon có đoạn: <?xml version="1.0" encoding="UTF-8"?>

Cái này có liên quan gì đến phiên bản của Excel không? Vì em đang gặp thực trạng sau:
- Add-in vào Excel 2016 dùng ổn.
- Add-in vào Excel 365 thì sau khi add, ribbon có hiện lên. Nhưng khi tắt file đi bật lại thì Ribbon lại mất. Kiểm tra trong hộp thoại Add-in thì vẫn check.

Em cảm ơn,
 
Chào anh @batman1 và các anh/chị,

Ngay dòng đầu của Code Xml để tạo Ribbon có đoạn: <?xml version="1.0" encoding="UTF-8"?>

Cái này có liên quan gì đến phiên bản của Excel không? Vì em đang gặp thực trạng sau:
- Add-in vào Excel 2016 dùng ổn.
- Add-in vào Excel 365 thì sau khi add, ribbon có hiện lên. Nhưng khi tắt file đi bật lại thì Ribbon lại mất. Kiểm tra trong hộp thoại Add-in thì vẫn check.

Em cảm ơn,
Dòng đấy chỉ phiên bản và kiểu mã hoá của file xml thôi, chắc không liên quan gì đâu
 
Chào anh @batman1 và các anh/chị,

Ngay dòng đầu của Code Xml để tạo Ribbon có đoạn: <?xml version="1.0" encoding="UTF-8"?>

Cái này có liên quan gì đến phiên bản của Excel không? Vì em đang gặp thực trạng sau:
- Add-in vào Excel 2016 dùng ổn.
- Add-in vào Excel 365 thì sau khi add, ribbon có hiện lên. Nhưng khi tắt file đi bật lại thì Ribbon lại mất. Kiểm tra trong hộp thoại Add-in thì vẫn check.

Em cảm ơn,
Cái dòng đó thì không liên quan gì tới Excel.

Tôi không biết sao bạn có lỗi như thế. Tôi không có phiên bản Excel để thử.

Chỉ nên lưu ý rằng với Excel phiên bản mới hơn thì dùng

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" >

thay cho

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"

Tôi không thể giúp bạn. Có thể có những cái tôi không biết chăng. Hơi lạ với tôi.
 
Cái dòng đó thì không liên quan gì tới Excel.

Tôi không biết sao bạn có lỗi như thế. Tôi không có phiên bản Excel để thử.

Chỉ nên lưu ý rằng với Excel phiên bản mới hơn thì dùng

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" >

thay cho

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"

Tôi không thể giúp bạn. Có thể có những cái tôi không biết chăng. Hơi lạ với tôi.
Vâng, em cũng thấy hơi lạ, không hiểu có phải do xung đột các Add-in hay không? mặc dù e cũng thử gỡ tất cả các addin chỉ để mình nó, vẫn bị tình trạng vậy.
 
File *.xlam không mở trực tiếp được anh ah,

Mấy chục năm dùng Excel lần đầu tiên có người nói file Addin *.xlam (*.xla) không mở trực tiếp được.

Bạn chỉ cần click đúp (hoặc chọn và nhấn enter) vào file đó là mở lên được thôi.

Em đang làm Addin bằng CustomUIEditor
Addin gì hay vậy bạn?

CustomUIEditor chỉ là công cụ trung gian tạo cái menu dạng Ribbon thôi.
 
Mấy chục năm dùng Excel lần đầu tiên có người nói file Addin *.xlam (*.xla) không mở trực tiếp được.

Bạn chỉ cần click đúp (hoặc chọn và nhấn enter) vào file đó là mở lên được thôi.


Addin gì hay vậy bạn?

CustomUIEditor chỉ là công cụ trung gian tạo cái menu dạng Ribbon thôi.
Vâng anh, enter vào thì chỉ mở excel ra thôi, chứ ko ra nội dung gì.
 
Không hiện lên Ribbon như mong đợi anh.

Thế thì chỗ này vô lý rồi.
1653553041675.png

Khi bạn mở trực tiếp file.xlam mà không hiện được ribbon -> chứng tỏ file.xlam đó có vấn đề.


Còn vấn đề của bạn
1653553130309.png

là do MS Excel không mở được file.xlam đó lên thôi (mặc dù vẫn có cái bạn mô tả là "vẫn check").
Cách khắc phục đơn giản đó là chép file.xlam vào thư mục Excel\XLSTART.
 
Không hiện lên Ribbon như mong đợi anh.
Bạn thử gửi file xml lên đi, có khi bạn viết sai mã cũng nên ấy. Chỉ cần sai một lỗi nhỏ như chữ hoa mà bạn lại viết thường hoặc quên dấu "/" là Ribbon cũng không hiện lên được rồi, mặc dù trong mục addin vẫn tích như thường
 
Bạn thử gửi file xml lên đi, có khi bạn viết sai mã cũng nên ấy. Chỉ cần sai một lỗi nhỏ như chữ hoa mà bạn lại viết thường hoặc quên dấu "/" là Ribbon cũng không hiện lên được rồi, mặc dù trong mục addin vẫn tích như thường
Đúng bạn, tôi biết điều này, nếu có sai thì ngay lúc Add đầu tiên Ribbon đã không lên được rồi.


là do MS Excel không mở được file.xlam đó lên thôi (mặc dù vẫn có cái bạn mô tả là "vẫn check").
Cách khắc phục đơn giản đó là chép file.xlam vào thư mục Excel\XLSTART.

Cảm ơn anh, để em thử giải pháp này xem sao.
 
Thế thì chỗ này vô lý rồi.
View attachment 276492

Khi bạn mở trực tiếp file.xlam mà không hiện được ribbon -> chứng tỏ file.xlam đó có vấn đề.


Còn vấn đề của bạn
View attachment 276493

là do MS Excel không mở được file.xlam đó lên thôi (mặc dù vẫn có cái bạn mô tả là "vẫn check").
Cách khắc phục đơn giản đó là chép file.xlam vào thư mục Excel\XLSTART.
Bây giờ e mới tìm được nguyên nhân, và cách khắc phục, em Post lên để nếu anh/chị nào gặp tình huống không load được Addin khi mở Excel có thể có giải pháp.
Bước 1: Click phải chuột vào File addin chọn Properties
imager_1_2712_700.png
Bước 2: Tab General, tích chọn Unblock

imager_2_2712_700.png
 
Ợ. Hóa ra là bạn tải file từ nơi nào đó về, mà không phải tự mình tạo ra.

Cái unlock kia là điều hiển nhiên bạn phải xử lý khi làm việc với Windows 10,11 mà.
Tự tạo chứ anh. Nhưng vẫn phải tích cái đó. Như e nói. Có máy add thì ko vấn đề gì, máy thì lại ko load được
 
Tự tạo chứ anh. Nhưng vẫn phải tích cái đó. Như e nói. Có máy add thì ko vấn đề gì, máy thì lại ko load được

Bạn làm theo người ta chỉ mà máy móc không hiểu.
Bạn đọc dòng ghi chú cạnh nút unlock ở hình bài bạn gửi nghĩa là gì.
Tự tạo trên một máy tính nào đó, rồi chép file đó sang máy tính khác thì dính chưởng thôi.
 
Bạn làm theo người ta chỉ mà máy móc không hiểu.
Bạn đọc dòng ghi chú cạnh nút unlock ở hình bài bạn gửi nghĩa là gì.
Tự tạo trên một máy tính nào đó, rồi chép file đó sang máy tính khác thì dính chưởng thôi.
Vâng anh, em hiểu chứ. Ở đây chỉ là có máy thì load được, có máy thì không? chứ không phải tất cả các máy mà anh.
 
Nhưng vẫn phải tích cái đó. Như e nói. Có máy add thì ko vấn đề gì, máy thì lại ko load được

Chời.
Thì rõ thông báo đó nó ghi là "might be", chứ không phải là chắc chắn.

1656644544276.png
Tức là nếu không bỏ khóa (unblock) thì chạy được hay không phụ thuộc vào thiết lập UAC của từng hệ điều hành.
Nếu bạn unblock thì chạy trên mọi máy tính cho kết quả như nhau.

Nếu bạn muốn hiểu sâu xa hơn thì tìm hiểu về 'policy' của Windows.
 

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

Back
Top Bottom