小编Rob*_*ert的帖子

ListObject.Resize() 在行数 == 1 时使 DataBodyRange 为空

我正在尝试重置 Excel ListObject 中的列数。我知道您可以一一添加和删除列,但我想避免不必要的循环。我决定使用 Resize 方法调整 ListObject 的大小。

这是我正在使用的代码(其中 OutputCasesTable 是 ListObject):

OutputCasesTable.DataBodyRange.Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;
Run Code Online (Sandbox Code Playgroud)

上面的代码行看起来工作得很好,但是如果 ListObject 只包含 1 行数据,则 ListObject 的 DataBodyRange 在第二行变为 null - 当我尝试更改其单元格的值时会产生错误。excel 中的行似乎仍然存在。

MSDN 文档说明如下: “标题必须保留在同一行中,结果列表必须与原始列表重叠。列表必须包含标题行和至少一行数据。”

现在我明白“一行数据”意味着该行包含值 - 所以这里错误的原因一定是 DataBodyRange 单元格都不包含值(“”)。但是,具有两个包含“”的数据行的表仍然没有包含数据的行,是吗?

我知道有很多方法可以完成这项任务,但我想了解为什么会发生这种情况。

临时解决方案:将代码替换为仅将要删除的列(高于新列数的列)中的值设置为空字符串。所有其他列将被替换:

if(OutputCasesTable.ListColumns.Count - CaseCount > 0) 
    OutputCasesTable.DataBodyRange.Offset[ColumnOffset: CaseCount].Resize[ColumnSize: OutputCasesTable.ListColumns.Count - CaseCount].Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢看第一个解决方案!

有什么我可以做的让它与空字符串一起工作吗?或者你有更好的解决方案吗?

此致,

c# excel

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

'找不到文件:VBA6.dll'错误 - 奇怪的行为

我正在使用Office 2013(64位)运行Windows 8.我正在尝试继续使用Office 2010(32位)开始的Excel中的VBA开发.我知道必要的64位更改但是我收到了令人困惑的配置错误.

这是问题所在:

  • 如果我创建一个新的Excel文件和VBA项目; 我的所有VBA代码都正常运行.没问题.
  • 如果我打开并使用以前在Office 2010中开发/使用的文件中的宏,则会收到"找不到文件:VBA6.dll"错误消息.
  • 一旦我开始收到消息,我会在所有VBA宏上收到它; 即使是那些(不超过30秒)以前工作正常的新品.
  • 如果我然后重新创建一个新的Excel文件和新的VBA项目,那么单个新代码就能正常工作.没有问题 - 直到我在其中一个'错误文件'中运行代码.然后故障蔓延到我的新发展中.

这就好像Excel让它的引用变得混乱,但每次我检查它们(在好的或坏的文件上)它们总是完全相同.

注意:

  • 我的参考文献都没有丢失.
  • 我的系统上没有VBA6.dll; 我有VBA7和'Visual Basic for Application'参考也指'C:\ Windows\SysWOW64\msvbvm60.dll'
  • 列表中还有另外两个"Visual Basic for Application"引用,但它不会让我更改它们
  • 它适用于没有VBA6.dll的新文件,所以我认为它不是必需的?
  • 我检查并安装了所有最新的Windows更新.

我该怎么做才能解决这个问题?

  • 如果您认为我需要VBA6.dll,那是因为引用的库使用它吗?
  • 如果是这样,为什么他们不使用VBA7?
  • 为什么在打开旧的VBA6文件之前它可以正常工作?Excel是否突然决定所有文件必须使用VBA6,因为之前有一个文件?

任何能够治愈我困惑的事情都非常感激,

最好的祝福

编辑:我差点忘了提;

  • 当我在收到错误后尝试调试错误时,Excel崩溃(每次).
  • 我还向[同一系统配置]尚未收到此问题的同事发送了"错误文件" - 他们也收到了错误消息.建议文件有问题吗?

编辑2:

问题尚未解决.我希望downvote不会妨碍我回答的机会.

  • 我也尝试重新注册库但没有任何改变.
  • 如果我打开一个"坏文件",我可以添加新的宏,它们工作正常; 但第二个我运行现有的宏并收到错误,新的宏也不起作用.

dll excel vba excel-vba

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

深度复制BindingList <Object>

我不知道该如何克隆BindingList<Object>

我想创建一个不共享相同引用的现有列表的新副本。另一个麻烦是我的对象本身包含一个嵌套的BindingList<Object>

我尝试了构造方法:

BindingList<Equation> NewEquationList = 
                         new BindingList<Equation>(OldEquations.ToList());
Run Code Online (Sandbox Code Playgroud)

然后,我尝试遍历列表,设置新值:

BindingList<Equation> NewEquationList;
foreach (Equation OldEquation in OldEquations)
{
    Equation NewEquation = new Equation()
    {
        NewEquation.ID = OldEquation.ID,
        ...
    };
    NewEquationList.Add(NewEquation);
}
Run Code Online (Sandbox Code Playgroud)

我试着隐含一个“复制构造函数”-我仍然不明白与上面的区别是什么,但它也不起作用。

我尝试将Equation类设置为[Serializable]并对该对象进行序列化/反序列化,但是我收到一条错误消息,指出在我的类中使用的PropertyChangedEventHandler未标记为Serializable。

我不认为制作引用类型的值副本将是一个复杂的过程,但是我在进行这项工作时遇到了困难。

我该怎么办?

编辑:

我的解决方案是将一个克隆方法添加到Equation的类中。我仍然不明白为什么这可行,而“复制构造函数”却行不通。

public Equation Clone()
{
    Equation NewEquation = new Equation();
    NewEquation.ID = this._ID;
    ...

    //Nested BindingList:
    NewEquation.EquationVariables = new BindingList<EquationVariable>  
            (this._EquationVariables.Select(EV => EV.Clone()).ToList());

    return NewEquation;
}
Run Code Online (Sandbox Code Playgroud)

使用以上内容,以下代码成功创建了深层副本:

NewEquationList = new BindingList<Equation>
        (OldEquations.Select(E => E.Clone()).ToList());
Run Code Online (Sandbox Code Playgroud)

c#

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

SQL中的递归滞后列计算

我正在尝试编写一个将计算的表数据插入另一个表的过程.

我遇到的问题是我需要每行的计算列受前一行计算列的结果的影响.我试图延迟计算本身,但这不起作用!

如:

(Max是我创建的函数,返回两个值中的最高值)

Id   Product      Model      Column1    Column2
1    A            1          5          =MAX(Column1*2, Lag(Column2))
2    A            2          2          =MAX(Column1*2, Lag(Column2))
3    B            1          3          =MAX(Column1*2, Lag(Column2))
Run Code Online (Sandbox Code Playgroud)

如果我在SQL中尝试以上内容:

SELECT
    Column1, 
    MyMAX(Column1,LAG(Column2, 1, 0) OVER (PARTITION BY Product ORDER BY Model ASC) As Column2 
FROM Source
Run Code Online (Sandbox Code Playgroud)

...它说column2未知.

如果我LAG进行Column2计算,我得到的输出:

Select Column1, MyMAX(Column1,LAG(Column1*2, 1, 0) OVER (PARTITION BY Product ORDER BY Model ASC) As Column2

Id   Column1    Column2
1    5          10
2    2          10
3    3          6
Run Code Online (Sandbox Code Playgroud)

第3排为什么6?因为3*2> 2*2.

我想要的输出:

Id …
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursion

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

标签 统计

c# ×2

excel ×2

dll ×1

excel-vba ×1

recursion ×1

sql ×1

sql-server ×1

vba ×1