My answer assumes that the Ribbon has been defined at design-time, using the Ribbon Designer. From your code, it appears this is what you're doing (as opposed to using Ribbon XML).
Note a field is declared at the class-level for the Ribbon class and is populated in the ThisAddin_Startup event so that it can be used at anytime during the "life" of the Add-in.
In addition, a SheetActivate event for the application is instantiated. This triggers every time a different worksheet is activated. In the event the name of the worksheet is checked. If it's the right one, the ribbon button is enabled; otherwise the button is disabled.
I set the button to be disabled by default in the Ribbon Designer properties. But you could also disable it in the Ribbon classes Load event, if you prefer.
public partial class ThisAddIn
{
Ribbon1 rbn;
string triggerName = "X";
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
rbn = Globals.Ribbons.Ribbon1;
this.Application.SheetActivate += new Excel.AppEvents_SheetActivateEventHandler(Application_SheetActivate);
}
void Application_SheetActivate(object Sh)
{
Excel.Worksheet wsh = (Excel.Worksheet)Sh;
if (wsh.Name == triggerName)
{
rbn.btnMsg.Enabled = true;
}
else { rbn.btnMsg.Enabled = false; }
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region VSTO generated code
}