小编Ala*_*ain的帖子

使用VBA将ArrayFormula设置为许多Excel单元格

我有一个输出单个值的数组公式,我想给一大堆单元格这个相同的数组公式.问题是当我将数组公式分配给范围时,它以这样的方式解释公式,即它们共享对数组公式的单个调用的输出,而不是每个输出单独的值.

为了告诉你我的意思,我使用以下代码:

With MarginalData
    .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)).FormulaArray = pullFormula
End With
Run Code Online (Sandbox Code Playgroud)

我想要的是一个看起来像这样的结果: 期望的结果

当我在范围中的每个单元格中分别输入数组公式时,它就是这样.

我得到的是: 结果

第一个单元格中的数组公式的输出在所有列中重复 - 它们共享相同的输出.

我如何以编程方式分配数组公式,就像每个单元格分别分配一样?


公式是:

{= INDEX(!BatchResults,MATCH(TTID&CHAR(1)&ROW() - 1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A $ 1,$ BatchTTIDData 1:$ 1,0))}

它必须作为数组公式放入,因为它不是在单个列上执行匹配,而是在两个连接列上执行匹配.列的串联必须作为数组返回,因此必须将公式作为数组公式输入.


到目前为止,最简单的解决方案是以下接受的答案的变体:

Const pullFormula = "=INDEX(BatchResults,MATCH(TTID&CHAR(1)&ROW()-1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A$1,BatchTTIDData!$1:$1,0))"
With wrksht
    With .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count))
        .Formula = pullFormula
        .FormulaArray = .FormulaR1C1
    End With
End With
Run Code Online (Sandbox Code Playgroud)

excel vba array-formulas

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

除非分隔符被转义,否则使用分隔符拆分

我正在阅读来自excel的剪贴板数据

var stream = (System.IO.Stream) ( Forms.Clipboard.GetDataObject() ).GetData( Forms.DataFormats.CommaSeparatedValue );,

但不幸的是,excel正在传递单元格文本而不是单元格值.当单元格使用特殊格式(例如千位分隔符)时,列中的一系列单元格的剪贴板数据如下所示:

 1,234,123.00    2,345.00    342.00      12,345.00
Run Code Online (Sandbox Code Playgroud)

存储如下:

\" 1,234,123.00 \",\" 2,345.00 \", 342.00 ,\" 12,345.00 \"
Run Code Online (Sandbox Code Playgroud)

当我真正想要的是这个:

 1234123.00, 2345.00, 342.00, 12345.00
Run Code Online (Sandbox Code Playgroud)

我以前使用该clipData.Split(new string[] { "," }, StringSllitOptions.None))函数将我的CSV剪贴板数据转换为一系列单元格,但是当存在包含逗号的转义格式化文本时,这会失败.


我问是否有人能想出一种方法将这个字符串拆分成一组单元格,忽略\"在位内转义的逗号,因为这是Excel选择转义包含逗号的单元格的方式.

简而言之,我如何转换包含此字符串的单个字符串:

\" 1,234,123.00 \",\" 2,345.00 \", 342.00 ,\" 12,345.00 \"
Run Code Online (Sandbox Code Playgroud)

到包含这个的字符串数组:

{ "1,234,123.00", "2,345.00", "342.00", "12,345.00" }
Run Code Online (Sandbox Code Playgroud)

不破坏我解析一个简单的逗号分隔字符串的能力.

*****编辑***

后续问题(表述为DFA):根据确定性有限自动机每次达到最终状态时拆分字符串?

c# string excel clipboard

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

Excel索引与偏移/间接 - 我不明白为什么偏移/间接在这种情况下更快

我有一个工作簿设置,其中第一个选项卡包含参数列表.每列是不同实例的一组参数.

然后我有一个实例的模板表,用户制作了这个模板的许多副本.模板所做的一件事是动态地从第一张表中提取参数.用户输入列号(1到n),并从第一个工作表中提取该列参数以在该实例上使用.然后,该实例使用这些参数运行了数十万行计算.

参数表

在此输入图像描述

示例实例

在此输入图像描述

我的问题似乎与波动性有关.对于大量实例,如果我使用offset或indirect来获取参数,则工作簿中任何单元格的任何更改都会导致在每个实例工作表上重新检索参数,因此每个工作表每次都会重新计算,每当进行更改时冻结工作簿约3秒钟.

我以为我可以通过使用索引减少这一点.每个工作表的参数引用包含该参数的第一个工作表上的行,并将要拉出的列编号作为索引参数.这解决了导致重新计算的任何变化的问题.现在只有参数范围的变化会导致重新计算,但由于某种原因,它会更糟糕.

现在,更改工作簿中的随机单元格不会导致整个事件在重新计算时冻结3秒,但更改参数范围内的相关单元格将导致每个工作表重新计算,并且大约需要10秒钟.为什么这种方法要慢得多.它应该在技术上与以前做同样的事情,只是在相关参数改变时.

有没有办法设置它,以便当前面板上的参数更改时,只有受该参数影响的图纸重新计算?

解决方案

我考虑过一个涉及VBA的复杂解决方案,因此复制模板实例会监视其"实例编号"单元格.当它被更改时,VBA代码可以将相应的参数复制到工作表并在此处硬拷贝值.我还需要VBA监控主参数表上的更改事件.当任何内容发生变化时,必须检查列号,迭代所有模板,并在引用该实例编号时重新复制值.我想避免使用这种解决方案,因为通常的原因是将VBA保持在等式之外,但如果没有办法让excel重新计算变得更聪明,那么可能是必要的.

excel optimization vba reference excel-formula

6
推荐指数
2
解决办法
5474
查看次数

有没有办法测试我的转换以避免使用异常?

我正在使用Reflection从DataRows构造任意对象,当橡胶最终遇到道路时,我需要从DataRow获取一个值并将其分配给对象上的属性.

由于DataRows可能包含不支持转换的类型,因此其中许多都会导致必须处理的异常.例如,DBnulls可能会在DataRow中出现,或者某种数字格式不能很好地转换为另一种,等等.有什么办法可以避免抛出异常吗?(我不会接受巨大的switch语句来检查目标对象属性和源数据中每种类型的组合.)

public void Merge(DataRow data)
{
  PropertyInfo[] props = this.GetType().GetProperties(BindingFlags...);
  foreach (PropertyInfo pi in props.Where(p => T_IsPrimitive(p.PropertyType)))
  {
    object src = null;
    if( dataAsDataRow.Table.Columns.Contains(pi.Name) )
       src = ((DataRow)data)[pi.Name];
    if (src != null)
    {
       if( src.GetType() != pi.PropertyType ) {
        try {
            src = Convert.ChangeType(src, pi.PropertyType);
        } catch(InvalidCastException e) {
            try { src = Convert.ChangeType(src.ToString(), pi.PropertyType); }
            catch { throw e; }
        }
       }
       pi.SetValue(this, src, null);
    }
  }
}

public bool T_IsPrimitive(Type t)
{
   return t.IsPrimitive || t == …
Run Code Online (Sandbox Code Playgroud)

c# exception-handling .net-4.0

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

标记扩展“StaticResourceExtension”要求在 IServiceProvider 中为 ProvideValue 实现“IXamlSchemaContextProvider”

我已经使用了几年的资源扩展在设计时在一个新的 .Net 4 项目中停止工作,并出现以下错误:

标记扩展“StaticResourceExtension”要求在 IServiceProvider 中为 ProvideValue 实现“IXamlSchemaContextProvider”。

扩展中的相关方法如下:

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        Style resultStyle = new Style();
        foreach (string currentResourceKey in resourceKeys)
        {
            object key = currentResourceKey;
            if (currentResourceKey == ".")
            {
                IProvideValueTarget service = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
                key = service.TargetObject.GetType();
            }
            Style currentStyle = new StaticResourceExtension(key).ProvideValue(serviceProvider) as Style;
            if (currentStyle == null)
                throw new InvalidOperationException("Could not find style with resource key " + currentResourceKey + ".");
            resultStyle.Merge(currentStyle);
        }
        return resultStyle;
    }
Run Code Online (Sandbox Code Playgroud)

据推测,编译器给出了错误,因为当我调用时currentStyle = new StaticResourceExtension(key).ProvideValue(serviceProvider);,我传递的 …

c# wpf extension-methods xaml .net-4.0

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

每次击键时都会调用转换器,而不是在用户输入结束时调用

自从切换到.NET 4.0以来,我遇到了数据输入问题.在我的Xceed 3.7网格中,用户以前能够在单元格中键入值,当它们单击或按回车键时,ConvertBack将调用绑定转换器的方法,解析用户输入值并以所需格式存储.

现在突然间,每次击键都会发生这种情况 - 这会导致一个巨大的问题,因为如果用户删除一个数字并开始输入另一个数字(比如说-100),一旦他们输入了负号,就会发生转换触发并抛出异常,因为" - "不是可解析的字符串,并且该值将被还原.

我认为问题非常明确,所以现在我将粘贴一些代码.

用户输入的列显示如下:

<xcdg:DataGridControl x:Name="AggCatGrid01"
      ItemsSource="{Binding Source={StaticResource myDataSource}}" >
<xcdg:DataGridControl.Columns>
      ...
      <xcdg:Column VisiblePosition="0" FieldName="SomeValue" Title="Some Value"
                   CellEditor="{StaticResource PercentageEditor}"
                   CellContentTemplate="{StaticResource EditablePercent2CellContentTemplate}" />
Run Code Online (Sandbox Code Playgroud)

Datagrids都具有相同的风格:

<Style x:Key="{x:Type xcdg:DataGridControl}" TargetType="{x:Type xcdg:DataGridControl}">
    <Setter Property="UpdateSourceTrigger" Value="CellEndingEdit"/>
    <Setter Property="AutoCreateColumns" Value="False"/>
    <Setter Property="EditTriggers" Value="BeginEditCommand, CellIsCurrent, ActivationGesture"/>
    <Setter Property="CellEditorDisplayConditions" Value="CellIsCurrent"/>
    <Setter Property="NavigationBehavior" Value="CellOnly"/>
Run Code Online (Sandbox Code Playgroud)

请注意,UpdateSourceTrigger设置为CellEndingEdit.我原以为这就是负责调用转换器并更新绑定值的时候.无论通过切换.NET4改变了什么控件.

这是您在上面看到的列的数据模板:

<!-- Styles used when editable cells are being edited. -->
<xcdg:CellEditor x:Key="PercentageEditor">
    <xcdg:CellEditor.EditTemplate>
        <DataTemplate>
            <xcdg:AutoSelectTextBox Style="{StaticResource …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf xaml .net-4.0 xceed-datagrid

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

KeyDown识别左右方​​向箭头键,但不能上下

使用下面的代码,左箭头键和右箭头键按预期运行,但不识别向上和向下箭头(单步执行它,在适当的情况下满足前两个条件,但后两个条件永远不会):

private void textBox1_KeyDown(object sender, KeyEventArgs e) {
    TextBox tb = (TextBox)sender;

    if (e.KeyCode.Equals(Keys.Left)) {
        SetFocusOneColumnBack(tb.Name);
        e.Handled = true;
        return;
    }
    if (e.KeyCode.Equals(Keys.Right)) {
        SetFocusOneColumnForward(tb.Name);
        e.Handled = true;
        return;
    }
    if (e.KeyCode.Equals(Keys.Up)) {
        SetFocusOneRowUp(tb.Name);
        e.Handled = true;
        return;
    }
    if (e.KeyCode.Equals(Keys.Down)) {
        SetFocusOneRowDown(tb.Name);
        e.Handled = true;
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我该如何解决?

UPDATE

这是我在踩过e.Keycode时看到的内容.如果我按下

  • ...左箭头键,我看到: e.KeyCode = "LButton | MButton | Space"
  • ...右箭头键,我看到: e.KeyCode = "LButton | RButton | MButton | Space"
  • ......向上箭头键,我看到: e.KeyCode = "RButton | MButton | Space"
  • ...向下箭头键,我看到: e.KeyCode …

c# keycode keydown arrow-keys winforms

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

在linq语句中使用类型别名会生成错误

由于某种原因,这个声明工作得很好:

vms.Where(vm => vm.MessageType == ValidationMessage.EnumValidationMessageType.Warning)
Run Code Online (Sandbox Code Playgroud)

但是如果在类的顶部,我定义了一个别名(以节省空间):

using MsgType = ValidationMessage.EnumValidationMessageType;
Run Code Online (Sandbox Code Playgroud)

然后得到的代码行:

vms.Where(vm => vm.MessageType == MsgType.Warning)
Run Code Online (Sandbox Code Playgroud)

给我一个错误:

在此输入图像描述 "代表' System.Func<ValidationMessage, int, bool>'不接受1个论点".奇怪的是,这不是我正在使用的代表.我正在使用' System.Func<ValidationMessage, bool>'重载.Where<>()- 与我不使用别名时相同.

请注意,别名正在使用的其他地方工作正常,只有在这些linq委托中它才会中断.为什么会这样?

c# linq visual-studio-2010

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

DateTime.TryParse无法解析DateTime.MinValue

我正在使用一个名为Json.NET的库,它在内部使用以下代码将JSON字符串解析为DateTime:

if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
{
     dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
     SetToken(JsonToken.Date, dt);
     return dt;
}
Run Code Online (Sandbox Code Playgroud)

我认为Json.NET搞砸了转换,但看起来它是DateTime.TryParse本身就是拙劣的价值.

当我解析以下有效的Iso日期(对应于UTC DateTime.MinValue)时:

string json = "0001-01-01T00:00:00+00:00";
DateTime dt;
DateTime.TryParse(json, invariantCulture, DateTimeStyles.RoundtripKind, out dt);
Run Code Online (Sandbox Code Playgroud)

结果是一个本地化的DateTime : {0001-01-01 8:00:00 PM},当转换回Utc时给出{0001-01-02 0:00:00 PM}.基本上,日期下溢,这正是您期望DateTimeStyles.RoundtripKind要避免的问题.

我该如何避免这种情况?

c# datetime json .net-4.0 json.net

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

功能区 labelControl GetSuperTip 不起作用

根据msdn 文档,alabelControl支持getSupertip在功能区控件上设置工具提示的属性。

但出于某种原因,工具提示不起作用。相同的实现适用于其他控件(如button),但不适用于labelControl。此外,其他回调(例如为getLabel标签工作),而不是getSupertip.

知道出了什么问题吗?

功能区 XML

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab id="custom" label="Custom AddIn">
        <group id="ConfigGroup" label="Configuration">
          <labelControl id="lb1" getLabel="GetLabel" getSupertip="GetSupertip" />
          <button id="bt1" label="Set Server URL" getSupertip="GetSupertip" />
          ...
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)

功能区代码

public class CustomRibbon : ExcelRibbon, IExcelAddIn
{
    public string GetSupertip(IRibbonControl control)
    {
        switch (control.Id)
        {
            case "lb1":
                return "The current server address is: " + API.serverURL;
            case "bt1":
                return "Click …
Run Code Online (Sandbox Code Playgroud)

c# excel vsto ribbon ms-office

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