我有10个XLS,每个都包含几百行VBA,它们做同样的事情.我想将这个公共代码移动到第11个XLS,并让其他10个代码在第11个XLS中调用.公共代码必须能够访问调用XLS中的所有数据和工作表.关于这个问题的其他答案似乎没有解决这个最后的要求.我可以将调用XLS的工作表作为参数或类似的东西传递给我吗?
我试图使自动变量可用于Excel VBA(如ActiveSheet或ActiveCell),PowerShell也可以将其作为"自动变量"使用.PowerShell引擎托管在Excel VSTO加载项中,Excel.Application可作为Globals.ThisAddin.Application使用.我在StackOverflow上找到了这个线程,并开始创建PSVariable派生类,如:
public class ActiveCell : PSVariable
{
public ActiveCell(string name) : base(name) { }
public override object Value
{
get
{
return Globals.ThisAddIn.Application.ActiveCell;
}
}
}
public class ActiveSheet : PSVariable
{
public ActiveSheet(string name) : base(name) { }
public override object Value
{
get
{
return Globals.ThisAddIn.Application.ActiveSheet;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并将他们的实例添加到当前的POwerShell会话:
runspace.SessionStateProxy.PSVariable.Set(new ActiveCell("ActiveCell"));
runspace.SessionStateProxy.PSVariable.Set(new ActiveSheet("ActiveSheet"));
Run Code Online (Sandbox Code Playgroud)
这有效,我可以使用PowerShell中的那些变量作为$ ActiveCell和$ ActiveSheet(它们的值更改为Excel活动工作表或单元格更改).然后我在这里阅读PSVariable文档并看到了这个:
"没有确定的方案可以从这个类派生.要以编程方式创建一个shell变量,创建一个这个类的实例并使用PSVariableIntrinsics类来设置它."
由于我是从PSVariable派生出来的,我试图使用建议的内容:
PSVariable activeCell = new PSVariable("ActiveCell");
activeCell.Value = Globals.ThisAddIn.Application.ActiveCell;
runspace.SessionStateProxy.PSVariable.Set(activeCell);
Run Code Online (Sandbox Code Playgroud)
使用它,$ ActiveCell出现在我的PowerShell会话中,但是当我在Excel中更改活动单元格时,它的值不会改变.
PSVariable文档中的上述注释是我应该担心的,或者我可以继续创建PSVariable派生类吗?有没有其他方法可以让PowerShell使用Excel全局变量?
我试图理解使用C#编写excel的excel.对于这样的项目,有一个名为ThisAddIn.cs的文件,它处理所有事件,如WorkBookOpen,WorkBookClose等.处理这样一个事件的代码是这样的 -
this.Application.WorkbookOpen += new Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,但是我不明白为什么它使用+ =符号进行赋值而不仅仅是=符号.+ =符号在这种类型的赋值中表示什么.它是与C#相关还是与AddIn开发相关的内容.我也是C#的新手.任何帮助,将不胜感激.
谢谢.
我想使用a System.Windows.Forms.Timer来确保在我正在创建的excel插件的UI线程上触发事件.我按如下方式构建计时器:
private System.Windows.Forms.Timer _timer;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Debug.WriteLine("ThisAddIn_Startup:" + Thread.CurrentThread.ManagedThreadId);
_timer = new System.Windows.Forms.Timer();
_timer.Tick += new EventHandler(TimerEventHandler);
_timer.Interval = 500;
}
Run Code Online (Sandbox Code Playgroud)
计时器是由我正在使用的库中的COM事件触发的:
private void OnEvent()
{
_timer.Start();
}
Run Code Online (Sandbox Code Playgroud)
然后我希望_timer在它滴答时调用以下方法:
public void TimerEventHandler(object sender, EventArgs args)
{
_timer.Stop();
Debug.WriteLine("Tick: " + Thread.CurrentThread.ManagedThreadId);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,当我在Addin线程中创建计时器时,即使它是从另一个线程启动的(在这种情况下是COM事件),它应该触发它创建的线程,即插件线程.但是,这不会发生.
我已经在RTDServer我过去写过的这个确切的机制中实现了(正如Kenny Kerr所概述的那样)并且它按预期工作,但_timer在这种情况下从未打过.
我还阅读了其他SO文章指出相同的行为,无法弄清楚我的插件设置有什么不同?
编辑: 触发OnEvent()方法.
我试图在一个excel插件中添加功能,这个插件正在开发,它修剪了在使用过的单元格末尾的前导空格,甚至可能解析文本,我需要这样做的原因只是让它变成一个超链接我已经工作但是这部分很好.
这是我到目前为止所尝试的,我有它修剪active.worksheet我很好,但我无法弄清楚如何:
这是我尝试修剪整个工作簿,它只是简单的我知道它,我只是想弄清楚:
Sub DoTrim(Wb As Workbook)
Dim cell As Range
Dim str As String
Dim nAscii As Integer
Dim wsh As Worksheet
For Each wsh In Worksheets
With wsh.UsedRange
For Each cell In ActiveSheet.UsedRange
str = Trim(cell)
If Len(str) > 0 Then
nAscii = Asc(Left(str, 1))
If nAscii < 33 Or nAscii = 160 Then
If Len(str) > 1 Then
str = Right(str, Len(str) - 1)
Else
str = ""
End If
End If
End …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能检测到用户何时单击了Excel中的页眉/页脚按钮,这样我就可以在我的加载项选项卡上显示一些自定义页眉/页脚相关的功能区控件,并在用户不在页眉中时隐藏它们/页脚编辑模式.
是否有可能以某种方式劫持此按钮?我见过应用程序劫持了Excel Save.我正在寻找与页眉/页脚按钮类似的行为.
我正在使用C#,Visual Studio 2012和Excel 2010.我使用Ribbon XML方法创建了自定义功能区.
我有一些使用Excel COM对象的Excel自动化代码.从其他SO帖子我知道应该尽快释放对象:
Excel.Range rng = GetSomeRange();
// do something with rng...
Marshal.ReleaseComObject(rng);
Run Code Online (Sandbox Code Playgroud)
但是,如果我在一个范围内循环遍历单元格,则以下是正确的过程吗?
Excel.Range rng = GetSomeRange();
foreach (Excel.Range r in rng)
{
// do something with r
Marshal.ReleaseComObject(r); // release at earliest possible convenience
}
Marshal.ReleaseComObject(rng);
Run Code Online (Sandbox Code Playgroud)
什么我不能确定这里是,如果我每次释放r的rng,然后我也释放rng我在有效释放rng两次或者释放正确其他参考资料r来rng和rng自己?
谢谢你!
编辑
我选择了后一种策略:
Excel.Range rng = GetSomeRange();
foreach (Excel.Range r in rng)
{
// do something with r
Marshal.ReleaseComObject(r); // release at earliest possible convenience
} …Run Code Online (Sandbox Code Playgroud) 我正在开发Excel 2013的加载项,我在Excel加载项中创建了一个函数,如下所示
public string ExcelReturnString()
{
return "This is the string: hi";
}
Run Code Online (Sandbox Code Playgroud)
我使用下面的代码来调用函数,但它会抛出一个错误.
Application.Run(ExcelReturnString)
Run Code Online (Sandbox Code Playgroud)
如何在宏中调用外接功能?
我正在使用VS 2010为Excel加载项创建自定义任务面板.我希望任务窗格始终对用户可见,因此无法关闭,移动或调整其大小.
有没有办法在任务窗格的标题栏中禁用这些功能?也许通过禁用右上角的关闭框和向下箭头按钮?
谢谢
我使用的是 Windows 版 Microsoft Excel 2010。
我已经开发了一个加载项addin.xlam,其中包含一个 sub main. addin.xlam位于正确的位置,以便通过菜单可见和选择Developer -> Add-Ins。当我打开普通工作簿test.xlsm并按 时Alt + F11,我可以看到 的代码addin.xlam已加载。
我的目标是向 Excel 的菜单栏添加一个菜单项,以允许用户main启动add-in.xlam. 通过点击此链接,我的代码addin.xlam如下:
Option Explicit
Dim cControl As CommandBarButtonPrivate
Sub Workbook_AddinInstall()
On Error Resume Next 'Just in case
'Delete any existing menu item that may have been left.
Application.CommandBars("Worksheet Menu Bar").Controls("Super Code").Delete
'Add the new menu item and Set a CommandBarButton Variable to …Run Code Online (Sandbox Code Playgroud) excel-addins ×10
c# ×7
excel ×6
vba ×4
excel-vba ×2
add-in ×1
com ×1
com-interop ×1
powershell ×1
timer ×1
vsto ×1