Cómo: Agregar comandos a menús contextuales en Excel
En este ejemplo se muestra cómo agregar un comando a un menú contextual en Excel mediante un complemento de nivel de aplicación. El menú contextual aparece al hacer clic con el botón secundario en una celda de una hoja de cálculo. Cuando el usuario final hace clic en el comando, el texto incluido en todas las celdas seleccionadas se escribe en un archivo de texto.
Se aplica a: la información de este tema se aplica a los proyectos de nivel de documento y los proyectos de nivel de aplicación para Excel 2007 y Excel 2010. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.
Agregue el siguiente código a la clase ThisAddIn de un proyecto de complemento de nivel de aplicación de Excel.
Ejemplo
Private WithEvents writeToText As Office.CommandBarButton
Private selectedCells As Excel.Range
Private Sub ThisAddIn_Startup(ByVal sender _
As Object, ByVal e As System.EventArgs) Handles Me.Startup
DefineShortcutMenu()
End Sub
Private Sub DefineShortcutMenu()
Dim menuItem As Office.MsoControlType = Office.MsoControlType.msoControlButton
writeToText = Application.CommandBars("Cell").Controls.Add(Type:=menuItem, _
Before:=1, Temporary:=True)
writeToText.Style = Office.MsoButtonStyle.msoButtonCaption
writeToText.Caption = "Write to a Text File"
writeToText.Tag = "0"
End Sub
Private Sub Application_SheetBeforeRightClick(ByVal Sh _
As Object, ByVal Target As Excel.Range, _
ByRef Cancel As Boolean) Handles Application.SheetBeforeRightClick
selectedCells = Target
End Sub
Private Sub writeToText_Click(ByVal Ctrl As Office.CommandBarButton, _
ByRef CancelDefault As Boolean) Handles writeToText.Click
Try
Dim currentDateTime As System.DateTime = _
System.DateTime.Now
Dim dateStamp As String = _
currentDateTime.ToString("dMMMMyyyy_hh.mm.ss")
Dim fileName As String = System.Environment.GetFolderPath( _
Environment.SpecialFolder.MyDocuments) & "\\" & _
dateStamp & ".txt"
Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(fileName)
For Each cell As Excel.Range In selectedCells.Cells
If cell.Value2 IsNot Nothing Then
sw.WriteLine(cell.Value2.ToString())
End If
Next
sw.Close()
Catch ex As Exception
System.Windows.Forms.MessageBox.Show(ex.Message)
End Try
End Sub
private Office.CommandBarButton writeToText;
private Excel.Range selectedCells;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
DefineShortcutMenu();
Application.SheetBeforeRightClick +=
new Excel.AppEvents_SheetBeforeRightClickEventHandler
(Application_SheetBeforeRightClick);
writeToText.Click +=
new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler
(writeToText_Click);
}
void writeToText_Click(Office.CommandBarButton Ctrl,
ref bool CancelDefault)
{
try
{
System.DateTime currentDateTime = System.DateTime.Now;
string dateStamp = currentDateTime.ToString("dMMMMyyyy_hh.mm.ss");
string fileName =
System.Environment.GetFolderPath
(Environment.SpecialFolder.MyDocuments) + "\\\\" + dateStamp + ".txt";
System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName);
foreach (Excel.Range cell in selectedCells.Cells)
{
if (cell.Value2 != null)
{
sw.WriteLine(cell.Value2.ToString());
}
}
sw.Close();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
void Application_SheetBeforeRightClick(object Sh,
Excel.Range Target, ref bool Cancel)
{
selectedCells = Target;
}
private void DefineShortcutMenu()
{
Office.MsoControlType menuItem = Office.MsoControlType.msoControlButton;
writeToText = (Office.CommandBarButton)Application.CommandBars["Cell"].
Controls.Add(menuItem, missing, missing, 1, true);
writeToText.Style = Office.MsoButtonStyle.msoButtonCaption;
writeToText.Caption = "Write to a Text File";
writeToText.Tag = "0";
}
Programación eficaz
Debe establecer la propiedad Tag de los controles cuando agregue controladores de eventos. Office utiliza la propiedad Tag para efectuar el seguimiento de controladores de eventos correspondientes a un control CommandBarControl concreto. Si la propiedad Tag está en blanco, los eventos no se controlarán correctamente.
Declare las variables de menú en el nivel de clase en lugar de hacerlo en el método donde son llamadas. Esto garantiza que las variables de menú permanezcan en el ámbito mientras la aplicación esté en ejecución. De lo contrario, el elemento se quita mediante la recolección de elementos no utilizados y el código del controlador de eventos deja de funcionar.
Vea también
Tareas
Cómo: Crear barras de herramientas de Office
Tutorial: Crear menús de acceso directo para marcadores
Cómo: Agregar comandos a menús contextuales en Word
Cómo: Agregar menús y elementos de menú personalizados a Outlook
Cómo: Agregar iconos personalizados a elementos de barras de herramientas y de menús
Conceptos
Parámetros opcionales en las soluciones de Office