2012-06-18 32 views
5

Khi tệp XML UI UI tùy chỉnh được sử dụng để thêm một số tab băng tùy chỉnh trong Access, tab ribbon đã chọn sẽ thay đổi trở lại tab tùy chỉnh đầu tiên bất cứ khi nào biểu mẫu được đóng lại.Có thể ngăn không cho MS Access tự động thay đổi tab ribbon đã chọn khi sử dụng ribbon tùy chỉnh không?

Chúng tôi tải băng tùy chỉnh theo chương trình từ VBA. Tôi đã tạo an accdb that reproduces the problem. Thư mục này cũng bao gồm một tệp XML chứa định nghĩa ribbon. Nó phải nằm trong cùng thư mục với tệp .accdb.

Vấn đề có thể dễ dàng được chứng minh:

  1. mở cơ sở dữ liệu RibbonTest.accdb,
  2. chuyển sang Tab2 và mở Form2 sử dụng nút trên ribbon và
  3. gần Form2.

Lưu ý rằng Tab1 hiện đang hoạt động.

Tất nhiên, trong ví dụ nhỏ này, vấn đề này có vẻ rất nhỏ. Tuy nhiên, chúng tôi có một dự án rất lớn với nhiều tab tùy chỉnh, mỗi tab chứa nhiều nhóm và nút. Người dùng của chúng tôi cảm thấy rất bực bội khi họ tiếp tục mất vị trí của họ trên dải băng mỗi khi họ đóng một biểu mẫu.

Chúng tôi đã điều tra một giải pháp thay thế mà chúng tôi lưu trữ tab đã chọn theo cách lập trình và khôi phục khi chúng tôi nghĩ rằng chúng tôi cần. Tuy nhiên, điều này chứng tỏ khó khăn để làm điều này một cách đáng tin cậy. (Không có API Office để tự động hóa dải băng như thế này, nhưng this article helped.)

Có ai khác đã gặp sự cố này không? Bạn đã tìm cách ngăn tab tự động thay đổi chưa?

Chỉnh sửa: Dường như vấn đề này đã được giới thiệu với bản sửa lỗi được triển khai trong Office 2010 SP1. (Xin lỗi, không có liên kết: không nghĩ rằng tôi có thể có nhiều hơn hai.) Vấn đề không có trong phiên bản RTM. Danh sách sửa lỗi cho SP1 bao gồm: "Access không kích hoạt hoặc trả lại người dùng cho đúng tab Ribbon cho đối tượng cơ sở dữ liệu đã mở trước đó khi người dùng quay trở lại đối tượng đó." Dường như họ đã cố gắng sửa chữa việc sử dụng thuộc tính Form.RibbonName (hỗ trợ các dải băng theo ngữ cảnh), nhưng đã phá vỡ dải băng mặc định trong tiến trình.

Trả lời

3

tiềm năng Cách giải quyết

Cái gì tôi tình cờ đó là được làm việc đối với tôi là để ẩn các tab đầu tiên trong XML bằng cách sử dụng thẻ có thể nhìn thấy. Tôi đã không thử nghiệm nó nhiều, nhưng tôi có một bản sao của tab Home tiêu chuẩn được ẩn (không có ý tưởng nếu nó cần phải là một tab dân cư hay không). Nó xuất hiện với tôi rằng vì Access không thể kích hoạt tab ẩn khi bạn đóng một biểu mẫu, nó vẫn còn trên một lựa chọn hiện tại.

Tôi không biết nếu điều này đã được khắc phục trong Access 2013 hay không, nhưng hy vọng thông tin không quá muộn để sử dụng cho ai đó.

+0

Tuyệt vời - đánh dấu phần này là câu trả lời thay vì cách giải quyết của tôi. – Olly

1

Có vẻ là một cách để có được tab chọn (như bạn đề cập và có thể đã có mã cho, và như bạn có thể tìm here)

Trong mô-đun RibbonCode: Save the ribbonObject đến một mô-đun -variable: trong xml thay đổi dòng đầu tiên:

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

và thêm này:

Private MyRibbon as IRibbonUI 
Private ActiveRibbonTab as string 

Sub OnRibbonLoad(ribbon As IRibbonUI) 
    Set MyRibbon = ribbon 
End Sub 

Sub RememberRibbonTab 
    ActiveRibbonTab=<Do the IAccessibleMagic here> 
End 

Sub RecallActiveTab 
    If ActiveRibbonTab<>"" then MyRibbon.ActivateTab(ActiveRibbonTab) 
    ActiveRibbonTab="" 
End 

Bây giờ, ở mọi hình thức, hãy thêm

Private Sub Form_Close() 
    Remember_RibbonTab 
End Sub 

Private Sub Form_GotFocus() 
    RecallActiveTab 
End Sub 
+0

Cảm ơn bạn! Chúng tôi đang sử dụng một cái gì đó như thế này vào lúc này, nhưng (như thường là trường hợp với cách giải quyết) của nó không hoàn hảo. Ví dụ, khi ruy-băng được giảm thiểu, cách giải quyết của chúng ta gây ra một số hành vi lạ. Tôi rất muốn biết nếu có một cách để làm cho Access chỉ để lại ribbon một mình! – Olly

0

Thực tế một cách tiếp cận hoạt động tốt là giảm hoặc loại bỏ các tab trong biểu mẫu bạn mở. Nếu bạn chỉ định ruy-băng (tab khác trong trang thuộc tính), thì khi bạn chuyển đổi giữa các hình thức, dải ruy băng sẽ hiển thị các công tắc cho bạn tự động và không có mã.Bây giờ trong khi điều này không thực sự là một giải pháp cho vấn đề của bạn, thì ý tưởng và khái niệm ở đây là nếu bạn phải bắt đầu viết một loạt mã để tham gia và chuyển sang tab nào thì điều này thực sự trở nên khó khăn như bạn chỉ ra.

Như đã lưu ý cho Access/office 2010, bạn có thể sử dụng mã để đặt tab hoạt động (tính năng này không khả dụng trong Access/office 2007).

Vì vậy, về đề xuất duy nhất tôi có ở đây là cố gắng và giới hạn hầu hết các biểu mẫu cho một tab khi có thể. Mẹo khác là trong khi trong các menu có thể được nhóm lại theo "loại nhiệm vụ" và do đó bạn có thể có một trình đơn thác xuống toàn bộ một loạt các báo cáo. Bây giờ với các ribbon khi làm việc trên một hóa đơn, sau đó bạn có:

Create invoice 
Balance invoice 
Post invoice 
Print invoice (a report). 

Vì vậy, tất cả các tùy chọn ở trên là những thứ khác nhau nhưng nhóm trong một dải ruy băng để cho phép bạn để có được một công việc làm. Vì vậy, ý tưởng ở đây là nhóm các tùy chọn ribbon không theo loại tùy chọn như tất cả các báo cáo, nhưng nhóm + tạo dải băng dựa trên thực hiện MỘT tác vụ bao gồm các tùy chọn mà người dùng yêu cầu cho tác vụ nhất định tại thời điểm đã cho.

Như đã lưu ý, ở trên có thể không phải là giải pháp cho (các) vấn đề của bạn, nhưng tránh các tab bổ sung thường sẽ giải quyết rất nhiều vấn đề này.

+0

Cảm ơn bạn đã đề xuất. Chúng tôi đã không điều tra thuộc tính Form.RibbonName mà bạn mô tả, nhưng thật đáng buồn nó không phải là một giải pháp cho chúng tôi. Chúng tôi không sử dụng tính năng ribbon theo ngữ cảnh; chúng tôi chỉ đơn giản có một dải băng lớn với nhiều tab mà chúng tôi sử dụng để cung cấp quyền truy cập vào các biểu mẫu trong dự án của chúng tôi. Thật thú vị, vấn đề chúng tôi đang gặp phải đã được giới thiệu với SP1, một cách đáng sợ vì một 'sửa' được thêm vào để làm cho thuộc tính Form.RibbonName hoạt động chính xác. – Olly

1

Đó là lỗi!

Hỗ trợ MS đã chấp nhận lỗi trình này và nhận xét về Office 2010 SP1, "Thay đổi đã được triển khai cho phép chúng tôi theo dõi tab hoạt động cho từng đối tượng cơ sở dữ liệu (biểu mẫu, báo cáo, v.v ...) bằng cách sử dụng TCID của tab rằng khi bạn di chuyển giữa các đối tượng tab hoạt động được phục hồi. Tuy nhiên các tab tùy chỉnh tất cả sử dụng giá trị TCID cùng, vì vậy với sự thay đổi này tab hoạt động cho các tab tùy chỉnh sẽ luôn di chuyển đến tab tùy chỉnh đầu tiên. "

Chúng tôi hy vọng rằng họ sẽ phát hành một hotfix để giải quyết vấn đề này trong tương lai.

Cách giải quyết

Thông tin sau đã chứng minh hữu ích cho chúng tôi trong việc tạo giải pháp thay thế.

  1. Xem câu trả lời từ Johanness ở trên về phương pháp IRibbonUI.ActivateTab. Điều này đã được giới thiệu trong Office 2010.
  2. Không có API Office (AFAIK) để nhận tab hiện được chọn. Do đó, chúng tôi sử dụng mã từ this article hữu ích. Chúng tôi
    • tạo một mảng khi chúng ta tạo ruy băng của chúng tôi có chứa các giá trị id của mỗi tab ribbon,
    • xử lý Form_Deactivate và sử dụng nó để bắt đầu một giờ trong một hình thức ẩn và cũng lưu trữ các chỉ số của các tab chọn,
    • trong Timer_Tick xử lý theo hình thức ẩn chúng tôi vô hiệu hóa bộ đếm thời gian và tìm kiếm các giá trị id của tab mà chỉ số chúng ta lưu trữ trong Form_Deactivate
    • kích hoạt tab sử dụng IRibbonUI.ActivateTab.
  3. This article cho thấy sử dụng thú vị là IRibbonUI.Invalidate và gọi lại getVisible để chọn một tab cụ thể.
+0

Cảm ơn bạn đã dành thời gian để thêm thông tin hữu ích cho các giải pháp có thể. –

4

này một dòng sửa chữa vấn đề:

<tab id="tabBogus" label="Bogus" visible="false"></tab>

Chỉ cần làm cho nó tab đầu tiên của bạn trong <tabs>. Cảm ơn câu trả lời của Potential Workaround của Scott !! (Cố gắng để bình chọn nó lên và/hoặc bình luận, nhưng chỉ cần đăng ký để không đủ danh tiếng.) Điều này tiết kiệm giờ (hoặc ngày) của công việc so với cách giải quyết phức tạp khác! Cảm ơn!

1

Tạo một biến Enumerator trong một mô-đun mã chung tương ứng với số tab ribbon của bạn (ALT + Y)

' Used By Send Keys to Select Correct Ribbon Tab. 
Enum eRibTabs 
    DataEntry = 1 
    Reporting = 2 
    StockAndParts = 3 
    AdminFinance = 4 
    DataImport = 5 
    OtherAdmin = 6 
    Admin = 7 
    LocalSystem = 8 
End Enum 

Tạo một hình thức trong ms truy cập được gọi là "zFrmRibbonSelect" và đặt một hộp văn bản không ràng buộc gọi là txtTabValue và sau đó đặt mã sau vào biểu mẫu mới của bạn. . (Đề nghị thiết lập chế độ hình thức để ẩn

Private Sub Form_Current() 
' Select Correct Tab Menu Item 
Me.txtTabValue = Me.OpenArgs 

End Sub 

Private Sub Form_Close() 
'Select Correct Tab Menu Item 
Dim varTab As Variant 

varTab = Me.txtTabValue 

SendKeys "%Y" & varTab 
SendKeys "{ESC}" 
SendKeys "{ESC}" 

End Sub 

Private Sub Form_Timer() 
DoCmd.Close acForm, Me.Name, acSaveNo 
End Sub 

Set hình thức đếm khoảng thời gian đến 500 và kiểm tra về sự kiện cho các chương trình hẹn giờ trong hộp tài sản, vv

On báo cáo của bạn đặt đoạn mã sau: (sử dụng giá trị Enumerator bạn muốn.)

Private Sub Report_Close() 
'Select Correct Tab Menu Item 
DoCmd.OpenForm "zFrmRibbonSelect", , , , , acHidden, eRibTabs.StockAndParts 
End Sub 

Đối với hình thức mà gần sử dụng đoạn mã sau int dạng

Private Sub Form_Close() 
'Select Correct Tab Menu Item 
    SendKeys "%Y" & eRibTabs.StockAndParts 
    SendKeys "{ESC}" 
    SendKeys "{ESC}" 
End Sub 
Các vấn đề liên quan