之前已经问 过这个问题,但每次接受的答案只是使用Application.MacroOptions
(VBA6)(VBA7)提供功能描述的辞职,但这些信息实际上并不是工具提示,所以它不能解决我的问题.
目标
我们都希望能够通过任何方式(VBA,VSTO或COM加载项)定义自定义函数,并为用户提供函数及其参数的弹出/工具提示描述的好处,如对于每个内置Excel函数,无论是内联还是在公式栏中都会出现:
对这种需求的广泛接受的答案是,定制功能是不可能的,但我希望挑战这种信念.
问题
目前,我见过的最好的人是定义函数(通常使用上面的MacroOptions调用),这样当调出函数对话框(公式栏中的fx按钮)时,它们的函数和参数说明如下所示:
如您所见,这是一个包含许多参数的复杂函数.如果用户不知道这个"函数参数"对话框以及如何启动它,而只是熟悉Excel的标准工具提示,他们只会看到公式名称而没有其他帮助:
他们没有机会正确提供所需的参数.(没有阅读文档,当然,没有用户做过.)
现在,高级用户可能知道通过键入Ctrl+ Shift+ A,他们将被授予一个自动完成的函数参数列表,如下所示:
但是,当然,我们遇到与上述相同的问题,即标准的Excel用户将只用于第一张图像的默认行为,并且可能永远不会学习该功能.
在这一点上应该清楚为什么这还不够,我们想要每个内置函数都有 - 内联工具提示告诉用户如何使用该函数.
挑逗
起初,我可能已经确信除了本机Excel应用程序功能之外,这是不可能的.加载项和VBA是可扩展性功能,此工具提示可能根本不可扩展.但是这个理论受到了Analysis Toolpak插件存在的挑战.当然,它是在微软内置的,但ANALYS32.xll是一个独立的XLL加载项,就像那些可以用VB,C,C++和C#生成的加载项一样.果然,当这个XLL加载到应用程序中时,它提供的功能具有与原生excel函数相同的工具提示:
当然,如果此信息以某种方式编码在此XLL文件中并传递给Excel,有一种方法可以使用我们自己的加载项复制它吗?我现在正处于这样的地步,我将开始自我教授一些反编译,看看我是否可以对分析工具库中发生的任何事情进行逆向工程.
你可以如何帮助
我几乎可以肯定,我已经研究了有关这个问题的所有公开信息.如果有人知道我不知道的东西可能会对此有所帮助,请随意插入.我对逆向工程编译的dll/xll非常不熟悉,所以如果有人感觉像是弹出他们的本地副本的Analysis32.xll和弄清楚它的定制功能定义是怎么回事,我非常感激.否则,我会继续深入研究这个问题,直到我遇到所有死胡同并报告我找到的东西.
我刚刚切换到Visual Studio 2010,现在每当我选择一些内容时,按Ctrl + C进行复制,单击其他地方,然后按Ctrl + V进行粘贴,我收到错误消息"无法导航到定义".在那之后,我再次尝试,它的工作原理.我应该关闭什么奇妙的新"功能"来阻止它?
我试图反映一些类属性并以编程方式设置它们,但看起来我的PropertyInfo过滤器之一不起作用:
//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter.
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty );
Run Code Online (Sandbox Code Playgroud)
我收到了错误
pi.SetValue(this, valueFromData, null);
Run Code Online (Sandbox Code Playgroud)
因为该属性只有一个get{}
方法,没有set{}
方法.
我的问题是,为什么这个属性没有过滤掉道具?我认为那是BindingFlags.SetProperty的目的.
未过滤掉的属性是:
public String CollTypeDescription
{
get { return _CollTypeDescription; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,我希望过滤不会提前工作的属性,因为我会立即列出所有属性.我不希望使用pi.GetSetMethod()
的事实后,以确定自己是否可以使用二传手.
大家好.我会尝试简单而简单.:)
我有
我需要
如果我使用VBA以编程方式编辑一组电子表格中的特定值,我会编辑所有这些电子表格以包含一组可在自动填充过程中使用的命名范围,但我不知道任何'命名Word文档中的字段'功能.
我如何编辑文档,并创建一个VBA例程,以便我可以打开每个文档,查找可能需要填写的一组字段,并替换值?
例如,某些东西的作用如下:
for each document in set_of_templates
if document.FieldExists("Name") then document.Field("Name").value = strName
if document.FieldExists("Address") then document.Field("Name").value = strAddress
...
document.saveAs( thisWorkbook.Path & "\GeneratedDocs\ " & document.Name )
next document
Run Code Online (Sandbox Code Playgroud)
我考虑过的事情:
是否存在类似于INotifyPropertyChanged的接口,其中事件args包含要更改的属性的旧值,或者我是否必须扩展该接口以创建一个?
例如:
public String ProcessDescription
{
get { return _ProcessDescription; }
set
{
if( value != ProcessDescription )
{
String oldValue = _ProcessDescription;
_ProcessDescription = value;
InvokePropertyChanged("ProcessDescription", oldvalue);
}
}
}
InvokePropertyChanged(String PropertyName, OldValue)
{
this.PropertyChanged( new ExtendedPropertyChangedEventArgs(PropertyName, OldValue) );
}
Run Code Online (Sandbox Code Playgroud)
我也会讨论类似PropertyChanging的事件,它提供这些信息,无论它是否支持e.Cancel.
我怎么能弄清楚xaml的哪一行包含麻烦的绑定当我的调试输出充满了如下所示的行:
System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='UW.Entities.ProgramModel.UWProgram' BindingExpression:Path=; DataItem='RuntimeType' (HashCode=24995901); target element is 'DataGridCollectionViewSource' (HashCode=60976864); target property is 'Source' (type 'Object')
我不知道如何以一种可以让我找到负责任的xaml行的方式解释这个.我甚至无法弄清楚错误来自哪个xaml文件.在发生这些错误时,有什么方法可以获得更多信息吗?
'UW.Entities.ProgramModel.UWProgram'只是一种类型 - 我不知道被绑定的对象是什么.我在xaml的各个位中也有很多DataGridCollectionViewSources,所有属性'Source'都绑定到可能有或没有那种类型的东西(再次 - 没有简单的方法可以告诉).
我正在研究一个庞大的团队应用程序,该应用程序正在以大量使用魔术字符串的形式NotifyPropertyChanged("PropertyName")
- 在咨询Microsoft时的标准实现.我们还遭受了大量错误命名的属性(使用具有数百个存储的计算属性的计算模块的对象模型) - 所有这些属性都绑定到UI.
我的团队经历了许多与属性名称更改相关的错误,导致错误的魔术字符串和破坏绑定.我希望通过实现属性更改通知而不使用魔术字符串来解决问题.我发现.Net 3.5的唯一解决方案涉及lambda表达式.(例如:实现INotifyPropertyChanged - 是否存在更好的方法?)
我的经理非常担心转换的性能成本
set { ... OnPropertyChanged("PropertyName"); }
Run Code Online (Sandbox Code Playgroud)
至
set { ... OnPropertyChanged(() => PropertyName); }
Run Code Online (Sandbox Code Playgroud)
提取名称的位置
protected virtual void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression)
{
MemberExpression body = selectorExpression.Body as MemberExpression;
if (body == null) throw new ArgumentException("The body must be a member expression");
OnPropertyChanged(body.Member.Name);
}
Run Code Online (Sandbox Code Playgroud)
考虑像电子表格这样的应用程序,当参数发生变化时,会在UI上实时重新计算和更新大约一百个值.是否会使此更改变得如此昂贵以至于会影响UI的响应能力?我现在甚至无法证明测试此更改的合理性,因为在各种项目和类中更新属性设置器需要大约2天.
我在工作表中设置了一个简单的if语句,其中if条件是VBA用户定义的函数:
Function CellIsFormula(ByRef rng)
CellIsFormula = rng(1).HasFormula
End Function
Run Code Online (Sandbox Code Playgroud)
这个功能似乎工作正常:
但由于某些原因,我无法弄清楚,该单元正在评估错误.更糟糕的是,在评估公式时,excel将错误归因于不会产生错误的计算步骤:
最重要的是,真正让我感到震惊的是,如果我只是重新输入公式,或强制完全重新计算(Ctrl+ Alt+ F9) - 公式评估没问题!
我已经尝试通过添加Application.Volatile
到函数代码使公式变为volatile ,但它没有改变任何东西.刷新计算的其他方法,例如将计算设置为手动然后返回自动,隐藏"重新计算工作表",或仅使用F9或Ctrl+ F9不工作,只重新输入公式或Ctrl+ Alt+ F9将导致函数正确重新计算.
更改if语句中引用的其中一个单元格不会解决问题,但是,更改"CellIsFormula"函数引用的单元格确实可以解决问题.每次重新打开工作表时,错误都会恢复.
我在隐藏列中有一个计算的值范围,我用它作为下拉框.为了确定用户选择了哪个值,我尝试在该范围上运行查找,但由于某些原因,只要该列被隐藏,Excel将不会返回与其选择对应的单元格.
如何在隐藏范围内的单元格上查找.记住 - 我正在搜索单元格计算值,而不是公式.
以下不起作用:
Set inserted = Range("RDS_Event_IDs").Find(Range("SelectedEvent"), , xlValues, xlWhole)
只要Range("RDS_Event_IDs")
隐藏细胞.
因为解决方案必须在一般情况下工作,其中可能隐藏搜索范围中的一些或全部,并且可能搜索整个工作表,所以以编程方式取消隐藏所有受影响的行和列然后重新编译是不可行的. - 隐藏以前隐藏的那些.
可能重复:
WPF绑定语法问题
我一直在使用这种语法,我以为我知道它做了什么,但现在我不知道.
Value="{Binding}"
Run Code Online (Sandbox Code Playgroud)
我在线搜索这种语法时遇到了很大麻烦,因为当然会忽略大括号.
例如:
<Style x:Key="GridCell" TargetType="{x:Type TextBlock}">
<Setter Property="ToolTip" Value="{Binding}}"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
当作为样式应用于文本块时,将工具提示绑定到文本块内容(文本)绑定的未映射(未转换)属性.
excel ×4
wpf ×4
c# ×3
vba ×3
.net-3.5 ×2
.net-4.0 ×2
binding ×2
excel-vba ×2
xaml ×2
.net ×1
data-binding ×1
decompiling ×1
events ×1
ms-word ×1
reflection ×1