Làm sao để tạo menu cùng cấp trong Excel 2007 (2 người xem)

Liên hệ QC

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

chipvang

Thành viên mới
Tham gia
29/11/08
Bài viết
37
Được thích
11
HI

Tôi dùng VBA để tạo thêm memu vào thanh "WorkSheets menu bar" nhưng các menu này không hiện cùng cấp với các menu Buid in của nó như menu Home chẳng hạn mà lại hiện ở menu Add-In

Ai có cách nào để tạo memu mà nó hiển thị ở cùng cấp với menu Home được không

(Excel 2003 hiện bình thường)
 
Để biết cách tạo thì xem trang này:
http://www.rondebruin.nl/ribbon.htm

Tải Icons Gallery từ trang này;
http://www.microsoft.com/downloads/...25-93E8-4ED4-8385-74D0F7661318&displaylang=en

Cách tạo cũng không quá khó! Ví dụ xem file đính kèm.

Ribbon.gif


TTP.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh Phong có thể giải thích cụ thể được không, file anh bảo vào xem giời không xem được nưa rồi!
 
Upvote 0
Xin được hỏi một vấn đề nữa liên quan tới menu. Tôi có dow về 1 file nói về tạo menu
nhưng khi tôi tạo menu thì nó nằm trong tab Add-Ins. Bây giờ tôi muốn nó nằm trong tab mới tự mình tạo ra thì phải làm sao. Chạy tên 2007,2010
xin chân thành cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xin được hỏi một vấn đề nữa liên quan tới menu. Tôi có dow về 1 file nói về tạo menu
nhưng khi tôi tạo menu thì nó nằm trong tab Add-Ins. Bây giờ tôi muốn nó nằm trong tab mới tự mình tạo ra thì phải làm sao. Chạy tên 2007,2010
xin chân thành cảm ơn

Bạn dùng Custom UI Editor
Để hiểu thêm về Custom UI Editor và cách viết nội dung để sau đó dán vào Custom UI Editor thì đọc thêm bài #7

http://www.giaiphapexcel.com/forum/...u-tự-tạo-trong-Excel-2007&p=454302#post454302
-------------
Nếu tôi viết không sót thì nội dung mà bạn cần dán vào Custom UI Editor là

Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon>
    <tabs>
        <tab id="MyCustomTab" label="TEN MOI">
            <group id="OneMenu" label="Menu Commands">
                <menu id="MySecretMenu" label="HO NGOC PHI" >
                    <button id="customButton1" label="Tinh tong" onAction="TinhTong" />
                    <button id="customButton2" label="Tinh tich" onAction="TinhTich" />
                    <menuSeparator id="Separator1" />
                    <menu id="MenuCap2" label="Menu cap 2" >
                        <button id="customButton3" label="Lua chon &amp;1" onAction="LuaChon1" />
                        <menuSeparator id="Separator2" />
                        <menu id="MenuCap2.1" label="Menu cap 2.1" >
                            <button id="customButton4" label="Menu cap 2.1.1" onAction="MenuCap211" />
                        </menu>
                        <button id="customButton5" label="Lua chon &amp;2" onAction="LuaChon2" />
                        <menuSeparator id="Separator3" />
                        <menu id="MenuCap2.2" label="Menu cap 2.2" >
                            <button id="customButton6" label="Menu cap 2.2.1" onAction="MenuCap221" />
                            <button id="customButton7" label="Lua chon &amp;3" onAction="LuaChon3" />
                        </menu>
                    </menu>
                </menu>
            </group>
        </tab>
    </tabs>
</ribbon>
</customUI>
 
Upvote 0
Thưa thầy cho em hỏi làm sao mình vào được của sổ soạn thảo của xml vậy thầy. em có thấy bài anh phong hướng dẫn nhưng vẫn làm không được. thầy có thể chỉ rõ cho em được không? em xin cảm ơn
 
Upvote 0
Em đã hiểu cảm ơn thầy nhiều. hôm nay đã được học một chiêu mới về menu. cảm ơn thầy rất nhiều
 
Upvote 0
Thưa thầy cho em hỏi làm sao mình vào được của sổ soạn thảo của xml vậy thầy. em có thấy bài anh phong hướng dẫn nhưng vẫn làm không được. thầy có thể chỉ rõ cho em được không? em xin cảm ơn

Bạn đã biết rồi, đúng không?. Tôi giải thích thêm cho những ai sẽ đọc bài này.
Trong link ở bài #5 tôi hướng dẫn rất kỹ từng bước thao tác. Có cả OfficeCustomUIEditorSetup.rar để tải về và cài đặt
 
Upvote 0
Sau khi được thọ giáo các thầy trên GPE em đã làm được menu như mong muốn
hình minh họa
Picture1.jpg
và em có gởi kèm theo file nhờ các thầy xem dùm vì em muốn tối ưu hóa cách viết.
có file kèm theo

bây giờ em sẽ nói yêu cầu của file này
trong XML em đã cho action chạy tất cả các module
ví dụ như
<button id="..." label="...." onAction="FINANCE06" />
<button id="..." label="...." onAction="FINANCE07" />
vì trong file này các macro của em chỉ sai có tham số truyền vào. Em muốn viết 1 macro rồi khi gọi thì chỉ cần gọi 1 macro rồi truyền tham số vào
ví dụ như mình chỉ gọi như vậy onAction="FINANCE(...)"

vì trong XLM em chưa biết cách gọi hàm truyền tham số như thế nào mong được sự chỉ giáo từ các thầy. em xin chân thành cảm ơn
(vì lý do bảo mật của khách hàng, nên nhờ mod xóa dùng file đính kèm. xin chân thành cảm ơn)
 
Lần chỉnh sửa cuối:
Upvote 0
Sau khi được thọ giáo các thầy trên GPE em đã làm được menu như mong muốn
hình minh họa
View attachment 115996
và em có gởi kèm theo file nhờ các thầy xem dùm vì em muốn tối ưu hóa cách viết.
có file kèm theo

bây giờ em sẽ nói yêu cầu của file này
trong XML em đã cho action chạy tất cả các module
ví dụ như
<button id="..." label="...." onAction="FINANCE06" />
<button id="..." label="...." onAction="FINANCE07" />
vì trong file này các macro của em chỉ sai có tham số truyền vào. Em muốn viết 1 macro rồi khi gọi thì chỉ cần gọi 1 macro rồi truyền tham số vào
ví dụ như mình chỉ gọi như vậy onAction="FINANCE(...)"

vì trong XLM em chưa biết cách gọi hàm truyền tham số như thế nào mong được sự chỉ giáo từ các thầy. em xin chân thành cảm ơn

Tôi không muốn tải tập tin của bạn - với tập tin như thế mà tôi ngồi tạo cho bạn XLM hoàn chỉnh thì có mà điên.

Khi bạn làm việc với Custom UI Editor thì bạn thấy nó tạo ra một cái "sườn" những Macro cho bạn.
Bạn thấy là nó tự thêm vào một tham số control As IRibbonControl. Có nghĩa là gì?
Khi bạn Click Button thì Macro gán cho Button đó sẽ được gọi để thực thi. Và lúc đó thì đối tượng button đó được truyền vào Macro ở dạng tham số control. Vậy thì nếu trong code mà bạn viết bạn đọc ra control.id thì nó chính là cái id mà bạn gán cho button trong XLM. Nếu trong XLM bạn gán cho button thuộc tính Tag thì khi đọc control.tag bạn sẽ có giá trị tag mà bạn gán cho button trong XLM.

vd. Trong XLM
Mã:
<button id="Button[B][COLOR=#0000ff]Operation[/COLOR][COLOR=#ff0000]1[/COLOR][/B]" label="..." onAction="[B][COLOR=#0000ff]Operation[/COLOR][/B]Macro" tag="[B][COLOR=#ff0000]1[/COLOR][/B]"

Nếu bạn biết Delphi thì khi bạn viết code cho vd. Click thì Delphi cũng tạo ra một cái "sườn" trong đó có tham số Sender (object). Nó cũng do Delphi thêm vào y như control đã được thêm vào. Trong Ribbon thì vai trò của control cũng có thể hiểu là CALLER.

Từ những điều trên thì bạn sẽ làm như sau:
1. Bạn gán cho tất cả các onAction một macro duy nhất. Tất nhiên chỉ những macro có cùng tên sub/function nhưng khác thông số. Cứ mỗi nhóm như thế thì gán cho cùng một macro. Ở bên dưới tôi lấy vd. module 15 các macro đều gọi OPERATION_MANAGEMENT_GARMENT_CALCULATION thì gán cho chúng 1 macro duy nhất là OperationMacro

2. Bạn gán cho các button những tag là các giá trị Unique từ 1 tới 127 (trong module 15 có 127 lần gọi macro với thông số khác nhau). Mục đích là để khi đọc ra control.tag thì biết button nào được chọn để thực thi code cho nó.

3. Trong code của macro "OperationMacro" (Custom UI Editor chỉ tạo cho bạn 1 macro duy nhất do bạn gán macro đó cho tất cả các button) bạn đọc ra control.tag để biết button nào (menu nào) được chọn để truyền tham số thích hợp cho sub OPERATION_MANAGEMENT_GARMENT_CALCULATION

4. Bạn khai báo một mảng vd. Arr1(1 to 127) As String với
Mã:
Arr1(1) = "anecalcplusmetricheavy.xls"
...
Arr(127) = "YarnTexMeticDenier-Conversions.xls"

Và lúc đó
Mã:
Sub OperationMacro(control As IRibbonControl)
    OPERATION_MANAGEMENT_GARMENT_CALCULATION(Arr1(control.tag))
End Sub

Tương tự cho các nhóm khác (gọi cùng 1 sub nhưng thông số khác nhau)
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cảm ơn thầy nhiều. Giờ thì em đã sáng và cv đã thông ra rồi. Chúc thầy và toàn thể các thành viên có 1 năm đầy sức khoẻ, và nhiều tài lộc. Em xin chân thành cảm ơn thầy
 
Upvote 0
Tôi không muốn tải tập tin của bạn - với tập tin như thế mà tôi ngồi tạo cho bạn XLM hoàn chỉnh thì có mà điên.

Khi bạn làm việc với Custom UI Editor thì bạn thấy nó tạo ra một cái "sườn" những Macro cho bạn.
Bạn thấy là nó tự thêm vào một tham số control As IRibbonControl. Có nghĩa là gì?
Khi bạn Click Button thì Macro gán cho Button đó sẽ được gọi để thực thi. Và lúc đó thì đối tượng button đó được truyền vào Macro ở dạng tham số control. Vậy thì nếu trong code mà bạn viết bạn đọc ra control.id thì nó chính là cái id mà bạn gán cho button trong XLM. Nếu trong XLM bạn gán cho button thuộc tính Tag thì khi đọc control.tag bạn sẽ có giá trị tag mà bạn gán cho button trong XLM.

vd. Trong XLM
Mã:
<button id="Button[B][COLOR=#0000ff]Operation[/COLOR][COLOR=#ff0000]1[/COLOR][/B]" label="..." onAction="[B][COLOR=#0000ff]Operation[/COLOR][/B]Macro" tag="[B][COLOR=#ff0000]1[/COLOR][/B]"

Nếu bạn biết Delphi thì khi bạn viết code cho vd. Click thì Delphi cũng tạo ra một cái "sườn" trong đó có tham số Sender (object). Nó cũng do Delphi thêm vào y như control đã được thêm vào. Trong Ribbon thì vai trò của control cũng có thể hiểu là CALLER.

Từ những điều trên thì bạn sẽ làm như sau:
1. Bạn gán cho tất cả các onAction một macro duy nhất. Tất nhiên chỉ những macro có cùng tên sub/function nhưng khác thông số. Cứ mỗi nhóm như thế thì gán cho cùng một macro. Ở bên dưới tôi lấy vd. module 15 các macro đều gọi OPERATION_MANAGEMENT_GARMENT_CALCULATION thì gán cho chúng 1 macro duy nhất là OperationMacro

2. Bạn gán cho các button những tag là các giá trị Unique từ 1 tới 127 (trong module 15 có 127 lần gọi macro với thông số khác nhau). Mục đích là để khi đọc ra control.tag thì biết button nào được chọn để thực thi code cho nó.

3. Trong code của macro "OperationMacro" (Custom UI Editor chỉ tạo cho bạn 1 macro duy nhất do bạn gán macro đó cho tất cả các button) bạn đọc ra control.tag để biết button nào (menu nào) được chọn để truyền tham số thích hợp cho sub OPERATION_MANAGEMENT_GARMENT_CALCULATION

4. Bạn khai báo một mảng vd. Arr1(1 to 127) As String với
Mã:
Arr1(1) = "anecalcplusmetricheavy.xls"
...
Arr(127) = "YarnTexMeticDenier-Conversions.xls"

Và lúc đó
Mã:
Sub OperationMacro(control As IRibbonControl)
    OPERATION_MANAGEMENT_GARMENT_CALCULATION(Arr1(control.tag))
End Sub

Tương tự cho các nhóm khác (gọi cùng 1 sub nhưng thông số khác nhau)
dạ thưa thầy vấn đề này em đã làm được rõ ràng và ok lắm, em muốn hỏi thêm về vấn đề này nữa( vấn đề này vẫn chưa sảy ra nhưng em muốn chặn trước nếu sau này có sảy ra thì mình cũng biết làm)
nếu như bài trước thì chỉ khác nhau 1 tham số. mình chỉ truyền 1 thẻ tag=1...
còn nếu như gặp trường hợp các hàm khác nhau 2 hoặc 3, hoặc 4 tham số thì mình truyền như thế nào? em xin chân thành cảm ơn thầy
 
Upvote 0
dạ thưa thầy vấn đề này em đã làm được rõ ràng và ok lắm, em muốn hỏi thêm về vấn đề này nữa( vấn đề này vẫn chưa sảy ra nhưng em muốn chặn trước nếu sau này có sảy ra thì mình cũng biết làm)
nếu như bài trước thì chỉ khác nhau 1 tham số. mình chỉ truyền 1 thẻ tag=1...
còn nếu như gặp trường hợp các hàm khác nhau 2 hoặc 3, hoặc 4 tham số thì mình truyền như thế nào? em xin chân thành cảm ơn thầy

Nếu bạn suy nghĩ thì tôi chắc là bạn cũng làm được.

Vì nói chung chung quá nên cũng khó chỉ hướng cụ thể cho bạn.
Những tham số đó là gì? Chắc không chỉ là số tự nhiên. Cũng có thể là chuỗi.

Vd. có 4 tham số (n tham số cũng được).

1. Nếu tất cả các macro đều gọi chung một sub/function chỉ có điều chọn button này thì tập 4 tham số là thế này còn nếu chọn button khác thì lại tập 4 tham số khác ... Nếu thế thì gán cho chúng một macro duy nhất vd. DoSomething

2. Về tag thì tùy bạn bố trí các giá trị tham số ấy ở đâu. Giả sử bạn có sub Sum2Cells(rng1 as Range, rng2 as Range) mà DoSomething sẽ gọi. Nếu thế thì bạn có thể sửa thành (chỉ là vd.) sub Sum2Cells(rowcell1 As Long, colcell1 As Long, rowcell2 As Long, colcell2 As Long). Tức bạn cần 4 tham số dạng Long.

Lúc đó thì bạn hãy thử (tôi chưa thử)

Mã:
<button id="ButtonOperation1" label="..." onAction="DoSomething" tag="3_3_7_11"
...
<button id="ButtonOperation100" label="..." onAction="DoSomething" tag="1_4_9_33"

Tôi không thử nhưng tin là ký tự "_" được phép. Nếu không thì dùng ký tự khác. Sau đó đọc ra control.tag rồi dùng Split tách thành 3, 3, 7, 11 hoặc 1, 4, 9, 33 rồi gọi Sum2Cells(Arr(0), Arr(1), Arr(2), Arr(3)). Thế thôi.

Những số 3, 3, 7, 11 cũng có thể là chỉ số trong một mảng nào đấy, vd. như mảng Arr1 ở bài trước, mà ta sẽ nhẩy tới đó để lấy tham số.

Tag thực chất là 1 STRING. Bạn hãy biến tấu cái String đó thành dạng mà bạn có thể "tuồn" tham số vào

vd. nếu dùng phiên bản 1 của sub Sum2Cells thì
Mã:
<button id="ButtonOperation1" label="..." onAction="DoSomething" tag="C3_D11"
...
<button id="ButtonOperation100" label="..." onAction="DoSomething" tag="A1_F33"

đọc control.tag và lọc ra các chuỗi "C3", "D11", "A1", "F33" rồi biến chúng thành Range C3, D11, A1, F33. Thế thôi

Láu cá một chút đi bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
dạ để em thử em nghỉ là được vì có hàm Split này và cách gọi tag="3_3_7_11" như thế này. em xin cảm ơn thầy nhiều
 
Upvote 0
Nếu bạn suy nghĩ thì tôi chắc là bạn cũng làm được.

Vì nói chung chung quá nên cũng khó chỉ hướng cụ thể cho bạn.
Những tham số đó là gì? Chắc không chỉ là số tự nhiên. Cũng có thể là chuỗi.

Vd. có 4 tham số (n tham số cũng được).

1. Nếu tất cả các macro đều gọi chung một sub/function chỉ có điều chọn button này thì tập 4 tham số là thế này còn nếu chọn button khác thì lại tập 4 tham số khác ... Nếu thế thì gán cho chúng một macro duy nhất vd. DoSomething

2. Về tag thì tùy bạn bố trí các giá trị tham số ấy ở đâu. Giả sử bạn có sub Sum2Cells(rng1 as Range, rng2 as Range) mà DoSomething sẽ gọi. Nếu thế thì bạn có thể sửa thành (chỉ là vd.) sub Sum2Cells(rowcell1 As Long, colcell1 As Long, rowcell2 As Long, colcell2 As Long). Tức bạn cần 4 tham số dạng Long.

Lúc đó thì bạn hãy thử (tôi chưa thử)

Mã:
<button id="ButtonOperation1" label="..." onAction="DoSomething" tag="3_3_7_11"
...
<button id="ButtonOperation100" label="..." onAction="DoSomething" tag="1_4_9_33"

Tôi không thử nhưng tin là ký tự "_" được phép. Nếu không thì dùng ký tự khác. Sau đó đọc ra control.tag rồi dùng Split tách thành 3, 3, 7, 11 hoặc 1, 4, 9, 33 rồi gọi Sum2Cells(Arr(0), Arr(1), Arr(2), Arr(3)). Thế thôi.

Những số 3, 3, 7, 11 cũng có thể là chỉ số trong một mảng nào đấy, vd. như mảng Arr1 ở bài trước, mà ta sẽ nhẩy tới đó để lấy tham số.

Tag thực chất là 1 STRING. Bạn hãy biến tấu cái String đó thành dạng mà bạn có thể "tuồn" tham số vào

Láu cá một chút đi bạn.
Dạ em đã làm được cảm ơn thầy nhiều vì đã khai sáng sử dụng Split vấn đề này của em xem như đã đạt đúng mọi yêu cầu trong công việc. và kết thúc tại đây, em xin cảm ơn thầy nhiều
 
Upvote 0

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

Back
Top Bottom