小编Ala*_*ain的帖子

使用 VBA 在 Word 中设置嵌套字段

我正在根据模板分段构建一个大型文档。#OVERALLPAGENUMBER#每个模板的页脚中都有一个关键字,我以编程方式将其替换为字段(使用 Excel VBA)。

如果我需要的只是该文档的页码,那么以下内容就足够了:

Dim storyRange As Object 'Word.Range
For Each storyRange In oDoc.StoryRanges
    Do
        With storyRange.Find
            .Text = "#OVERALLPAGENUMBER#"
            .Wrap = 1 'wdFindContinue
            .Execute
            While .found
                storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True
                .Execute
            Wend
        End With
        On Error Resume Next
        Set storyRange = storyRange.NextStoryRange
        On Error GoTo 0
    Loop While Not storyRange Is Nothing
Next
Run Code Online (Sandbox Code Playgroud)

我已经测试了这段代码,它成功地将页码放入页脚中。然而,我想要的是一个嵌套(公式)字段,它将固定数字添加到页码,以便我可以显示多个文档的页数。我的解决方案,如果我手动执行(使用 Ctrl+F9),给出的字段代码如下所示:

{ = 5 + { PAGE } }
Run Code Online (Sandbox Code Playgroud)

并正确生成第 1 页上的“6”、第 2 页上的“7”等......

不管我怎么尝试,我都无法使用 VBA 复制这种字段嵌套。(宏记录器在这里没用)。有人能找到以编程方式创建这些字段的方法吗?


解决方案

我的问题是,拥有PreserveFormatting:=True阻碍了我将一个字段嵌套在另一个字段中的尝试。现在,以下简单的解决方案有效:

With …
Run Code Online (Sandbox Code Playgroud)

excel vba ms-word word-field

3
推荐指数
1
解决办法
3194
查看次数

快速将字典清空为Excel工作表的方法

清空Scripting.DictionaryExcel表格的最快方法是什么?这就是我现在正在做的事情,但是对于一个包含大约3000个元素的字典,它显然很慢.我做了我能想到的每一个优化.

这是我所拥有的一个简单的版本:

'wordCount and emailCount are late bound "Scripting.Dictionary" objects
Private Sub DictionaryToExcel(ByRef wordCount As Object, emailCount As Object)
    oExcel.EnableEvents = False
    oExcel.ScreenUpdating = False
    Set oWorkbook = oExcel.Workbooks.Add
    oExcel.Calculation = -4135
    With oWorkbook.Sheets(1)
        iRow = 1
        For Each strKey In wordCount.Keys()
            iWordCount = wordCount.Item(strKey)
            iEmailCount = emailCount.Item(strKey)
            If iWordCount > 2 And iEmailCount > 1 Then
                .Cells(iRow, 1) = strKey
                .Cells(iRow, 2) = iEmailCount
                .Cells(iRow, 3) = iWordCount
                iRow = iRow + 1
            End If
        Next strKey …
Run Code Online (Sandbox Code Playgroud)

excel optimization vba dictionary excel-vba

3
推荐指数
1
解决办法
3231
查看次数

PC寄存器上的ARM LDR指令

我在这里理解这个故事:

  • PC寄存器保存指向下一条指令的指针
  • LDR指令将第二个操作数的值加载到第一个操作数中(例如)
    LDR r0, [pc, 0x5678]
    相当于这个"C代码"
    r0 = *(pc + 0x5678)
    
    它是使用基本偏移量解引用的指针.

我的问题是:

我找到了这段代码

LDR PC, [PC,-4]

它被评论为猴子修补等.

我如何理解这段代码

pc = *(pc - 4)

在这种情况下,"pc"寄存器将取消引用前一条指令的地址,并将包含指令的"机器代码"(不是指令的地址),程序将跳转到该无效地址继续执行,可能我们将"分段故障".那么我缺少或不理解?



让我思考的是LDR指令中第二个操作数的括号.据我所知,x86架构上的括号已经取消引用指针,但我无法理解ARM架构中的含义.

mov r1, 0x5678
add r1, pc
mov r0, [r1]

这段代码相当于?

LDR r0, [pc, 0x5678]

assembly patch arm monkeypatching

3
推荐指数
1
解决办法
9979
查看次数

在C#中覆盖事件真的是一个错误吗?

我在这个问题中读到:在VB中覆盖事件

在C#中覆盖事件甚至是错误的.C#编程指南说:不要在基类中声明虚拟事件,并在派生类中覆盖它们.C#编译器在Microsoft Visual Studio 2008中无法正确处理这些问题,并且无法预测派生事件的订阅者是否实际订阅了基类事件.我想知道为什么框架类会破坏这个规则,甚至编译器为什么允许它.

我无法理解为什么覆盖事件是一个错误.当然,继承类总是可以监视基类事件并在之后采取自己的操作,但是如果它想确保它是第一个查看事件的事件观察者呢?它想在某些条件下决定吞下这个事件?做这样的事情有什么问题:

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        VerifyActiveCountMatches();
        base.OnCollectionChanged(e);
        InvokePropertyChanged("Count");
    }
Run Code Online (Sandbox Code Playgroud)

c# wpf coding-style event-handling .net-3.5

2
推荐指数
1
解决办法
843
查看次数

在Visual Studio 2008 TFS中将最近的主干更改合并到不久前的主干分支

我一直在试图用树枝将树木的变化合并到树干上.

大约一个月前,行李箱(5.0)分支(至6.0).从那时起,已经在6.0分支上进行了开发,但是对主干也进行了热修复.我现在想要更新6.0.x分支,其中包含对主干所做的所有更改,因为6.0分支是在大约一个月前从5.0主干形成的.

有没有办法在不检查trunk(5.0.x)和分支(6.0.x)以及使用第三方工具来协调差异的情况下执行此操作?

version-control tfs visual-studio-2008

2
推荐指数
1
解决办法
4021
查看次数

Excel IF条件,如果作为数组公式输入将评估为TRUE,否则为FALSE

我试图愚弄我正在交给其他人的仪表板,它包含一些数组公式.如果有人编辑其中一个数组公式并忘记命中Ctrl+Shift+Enter,那么现在所发生的一切都是公式开始以微妙的方式返回错误的结果.

我想要的是某种IF检查,我可以添加到公式,如果他们忘记输入它作为数组公式,将允许我返回一个明确的错误.

就像是:

=IF(IsArrayFormula, NormalFormula, "Ctrl+Shift+Enter Required")
Run Code Online (Sandbox Code Playgroud)

VBA对我来说不是一个选择,但如果你想为没有这个限制的人留下VBA解决方案我不会投票.

excel array-formulas

2
推荐指数
1
解决办法
80
查看次数

无法在样式中的Target标记上指定事件'LostFocus'.请改用EventSetter

为什么我收到此错误消息?我正在使用事件设定器!

<Style TargetType="{x:Type xcdg:DataCell}">
    <EventSetter Event="LostFocus" Handler="cellLostFocusHandler" />
</Style>
Run Code Online (Sandbox Code Playgroud)

编辑

我没有使用内联样式.它在资源中,即:

<DataGrid.Resources>
    <Style TargetType="{x:Type xcdg:DataCell}">
        <EventSetter Event="LostFocus" Handler="cellLostFocusHandler" />
    </Style>
</DataGrid.Resources>
Run Code Online (Sandbox Code Playgroud)

wpf xaml binding .net-3.5

1
推荐指数
1
解决办法
2912
查看次数

无法绑定超链接在我的视图中命令ICommand

我将我的xaml中两个超链接的command属性绑定到视图中的命令(这是datacontext):

<TextBlock>
   <Hyperlink x:Name="linkCheckAll" Command="{Binding CheckAllZonesCommand}" CommandParameter="{Binding}">Check All</Hyperlink>
   <TextBlock Margin="0,0,20,0"/>
   <Hyperlink x:Name="linkUncheckAll" Command="{Binding UncheckAllZonesCommand}" CommandParameter="{Binding}">Uncheck All</Hyperlink>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

在此输入图像描述

绑定命令时出现以下错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'CheckAllZonesCommand' property not found on 'object' ''ZonesView' (HashCode=56756307)'. BindingExpression:Path=CheckAllZonesCommand; DataItem='ZonesView' (HashCode=56756307); target element is 'Hyperlink' (HashCode=50738642); target property is 'Command' (type 'ICommand')
System.Windows.Data Error: 40 : BindingExpression path error: 'UncheckAllZonesCommand' property not found on 'object' ''ZonesView' (HashCode=56756307)'. BindingExpression:Path=UncheckAllZonesCommand; DataItem='ZonesView' (HashCode=56756307); target element is 'Hyperlink' (HashCode=53994596); target property is 'Command' (type 'ICommand')
Run Code Online (Sandbox Code Playgroud)

"ZonesView"是我的dataContext,我很肯定它包含有问题的命令:

public class …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml binding .net-4.0

1
推荐指数
1
解决办法
6429
查看次数

相对SourceURI无法正常工作

我无法弄清楚适用于我的资源的相对路径.我已经尝试了我能想到的一切.唯一有效的是绝对路径只在我的系统上正确,但在任何部署版本中都是不正确的.

据我所知,这条非常简单的路径应该有效.

public class GreyscaleEffect : ShaderEffect
{
    private static PixelShader _pixelShader = new PixelShader()
        { UriSource = new Uri("/Effects/Greyscale.ps", UriKind.Relative) };
Run Code Online (Sandbox Code Playgroud)

我得到错误The type initializer for 'FSR.WPF.Utilities.UI. GreyscaleEffect' threw an exception.内部异常:Cannot locate resource 'effects/greyscale.ps'.

我也尝试过以下方法:

Uri(";component/Effects/Greyscale.ps", UriKind.Relative)
Uri("/;component/Effects/Greyscale.ps", UriKind.Relative)
Uri("/FSR.WPF.Utilities.UI;component/Effects/Greyscale.ps", UriKind.Relative)
Run Code Online (Sandbox Code Playgroud)

在其他地方(在MUSUI的xaml文件中),使用以下路径,它工作正常:

<Image Source="/FSR.WPF.Utilities.UI;component/assets/CurrencyFlags/USD.png"
Run Code Online (Sandbox Code Playgroud)

所以我无法弄清楚为什么这种类似的情况不起作用.

只有以下绝对路径有效:

Uri("C:\TFS\MUS 6.1.x\Mosaic Middleware\FSR.WPF.Utilities\FSR.WPF.Utilities.UI" +
    "\Effects\Greyscale.ps")
Run Code Online (Sandbox Code Playgroud)

我也@使用UriKind.Absolute在字符串前面使用的每个组合尝试了所有上述内容,并完全省略了第二个参数.没有什么可行,但绝对的道路,我正在失去理智.

这是解决方案结构.主项目是MUSUI,底部是粗体.此效果类和.ps文件都位于Effects文件夹中,该文件夹位于引用的程序集FSR.WPF.Utilities.UI的根目录中.

在此输入图像描述

无论如何,我知道这必须以某种方式工作.任何能够找出最短工作相对路径的人,特别是如果它不需要在程序集名称中进行硬编码,就会获得奖励.

c# wpf xaml .net-4.0

1
推荐指数
1
解决办法
5869
查看次数

如何使用可绑定的ConverterParameters制作转换器?

大多数转换器不带参数或一个固定参数,并且易于绑定到:

<local:MyConverter x:Key="MyConverterInstance" />

<TextBox Text="{Binding Path=MyTime, 
                        Converter={StaticResource MyConverterInstance},
                        ConverterParameter='yyyy/MM/dd'}" />
Run Code Online (Sandbox Code Playgroud)

但是,如果我希望该格式是用户可以更改的动态属性,我不能做这样的事情,对吧?:

<TextBox Text="{Binding Path=MyTime, 
                        Converter={StaticResource MyConverterInstance},
                        ConverterParameter={Binding Path=UserFormat}}" />
Run Code Online (Sandbox Code Playgroud)

所以我唯一的选择是在MyConverter上定义DependencyProperty以进行绑定.但我的转换器定义是StaticResource.我不能去

<local:MyConverter x:Key="MyConverterInstance" 
                   Format="{Binding Path=UserFormat}"/>
Run Code Online (Sandbox Code Playgroud)

因为StaticResources上没有DataContext.我怎么设置它?

wpf xaml converter .net-4.0

1
推荐指数
1
解决办法
2591
查看次数

RibbonControl 属性回调(getPressed、getSupertip 等)从不更新

虽然某些 Office 功能区控件属性可以直接设置(例如标签),但大多数使用回调来设置属性。例如按钮的图像:

<button id="btnRecalculate" getImage="GetRibbonControlImage" label="Recalculate Now"  onAction="OnButtonAction" size="normal" />
Run Code Online (Sandbox Code Playgroud)

文档对这些回调的语法非常清楚,但没有说明调用它们的时间和频率。

我现在面临一个问题,当以编程方式更改值时,我想修改功能区上的其中一个属性(例如按钮上的工具提示)。我为超级提示定义了一个回调,如下所示:

<button id="btnSetServerURL" getSupertip="GetSuperTip" label="Set Server URL" />
Run Code Online (Sandbox Code Playgroud)

以及隐藏的代码:

public string GetSuperTip(IRibbonControl control)
{
    switch( control.Id )
    {
        case "btnSetServerURL":
            return "Click to set the server URL. (Currently: " + API.URL + ")";
        default:
            return "";
    }
}
Run Code Online (Sandbox Code Playgroud)

当该 URL 更改时,下次用户将鼠标悬停在该按钮上时,我希望调用 GetSuperTip 回调并显示消息以显示正确的当前 URL,但现在该值只是第一次设置,再也不会设置。

有什么办法可以得到我寻求的行为吗?这是一个 Excel 插件,据我所知,WPF 样式绑定不是一个选项。

c# excel ribbon callback excel-addins

1
推荐指数
1
解决办法
1271
查看次数

为什么Json.NET Parser会自动本地化它正在解析的日期?

我遇到了Json.NET Parser的问题.根据文档,简单地使用ToString()没有特殊的转换器应该保持Json不变.

然而,我的Json字符串正在被修改,它的日期会自动本地化,并且它会给我带来各种各样的问题.例如,当我向它提供以下字符串时:

{
    "_type": "Basic",
    "id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1",
    "description": "TestBasicDescription",
    "participation": 1.000000000000000,
    "inception_date": "2014-02-06T20:34:00.925000+00:00",
    "expiry_date": "0001-01-01T00:00:00+00:00"
}
Run Code Online (Sandbox Code Playgroud)

我期待代码

Newtonsoft.Json.Linq.JObject.Parse(content).ToString(Formatting.None);
Run Code Online (Sandbox Code Playgroud)

产生几乎相同的字符串.然而,我得到的是:

{
    "_type": "Basic",
    "id": "44902a0f-7842-3a2d-83bf-a874ce0b47a1",
    "description": "TestBasicDescription",
    "participation": 1.0,
    "inception_date": "2014-02-06T16:34:00.925-04:00",
    "expiry_date": "0001-01-01T20:00:00-04:00"
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我的日期已经本地化.

更糟糕的是,在边界日期的情况下(DateTime.MinValue如上所示),这种自动本地化的值实际上是错误的.时区偏移导致小时值环绕,并且由于日期不能更低,它不会改变,有效地将日期转换为DateTime.MinValue加1天:当它转换回UTC时间(原来是)时日期变成了"0001-01-02T00:00:00+00:00".提示单元测试爆炸.

为什么Json.Net的表现不像它说的那样?有没有办法解析输入Json然后ToString()完全按原样解析?

c# .net-4.0 json.net deserialization

1
推荐指数
1
解决办法
2635
查看次数