C# 使用ShaperAge调整Excel中注释的大小

C# 使用ShaperAge调整Excel中注释的大小,c#,excel,comexception,C#,Excel,Comexception,我有一个电子表格,它是以编程方式创建的,里面有很多注释(最多40000条)。从工作表中删除几列后,注释的大小将调整。这显然是excel中的一个bug。() 理想情况下,我希望在删除列后立即自动调整所有注释的大小 为了避免在每一条评论中循环出现,以下是我到目前为止所做的尝试 设置AutoShapedFaults无效-删除列后注释仍会调整大小 XlPlacement属性。XlMove和XLMoveAndSize不起作用 Worksheet.Shapes.SelectAll会抛出OutOfMemor

我有一个电子表格,它是以编程方式创建的,里面有很多注释(最多40000条)。从工作表中删除几列后,注释的大小将调整。这显然是excel中的一个bug。()

理想情况下,我希望在删除列后立即自动调整所有注释的大小

为了避免在每一条评论中循环出现,以下是我到目前为止所做的尝试

  • 设置AutoShapedFaults无效-删除列后注释仍会调整大小
  • XlPlacement属性。XlMove和XLMoveAndSize不起作用
  • Worksheet.Shapes.SelectAll会抛出OutOfMemory异常,无论注释数量如何
我的想法是获取电子表格中所有注释的ShapeRange对象,并从中设置大小

这非常有效:

        public static void ResizeComments()
        {
        Microsoft.Office.Interop.Excel.Workbook objWorkbook;
        objWorkbook = (Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
        Worksheet objSheet = (Worksheet)objWorkbook.ActiveSheet;

        int[] test = {1,2,3,4,5};
        ShapeRange sRange = objSheet.Shapes.Range[test];
        sRange.Height = 100;
        sRange.Width = 220;
        }
更改为此将在自动调整行抛出异常“来自HRESULT的异常:0x800A03EC”

        ShapeRange sRange = objSheet.Shapes.Range[test];
        sRange.TextFrame.AutoSize = true;
使用我的实际形状索引数组会引发相同的异常,但在Shapes.Range[]中除外。 我在调试时查看了shapes变量,它与test相同,只是它是int[249]而不是int[5]

        int[] shapes = (int[])shapes.ToArray(typeof(int)); 
        ShapeRange sRange = objSheet.Shapes.Range[shapes];

我将用VBA代码来回答这个问题,该代码必须在Excel的模块中运行。从讨论到回答

保留不需要的代码和注释项。我仍然需要对合并后的单元格进行补偿,这些单元格还不能处理


干杯

也许这应该是一个答案,但它不是一个答案,因此请注意:要应用autosize,您必须在数组中循环。我假设
int[]shapes=(int[])shapes肯定有问题Sub CommentFixer()
Dim Arng As Range, Acl As Variant, InitRng As Variant, MaxSize
Set InitRng = Selection
Set Arng = Application.InputBox("Select Ranges", , , , , , , 8)

For Each Acl In Arng
    If (Not (Acl.Comment Is Nothing)) And (Acl.MergeArea.Count = 1) Then
        Acl.Select
        Selection.Comment.Visible = True
        Selection.Comment.Shape.TextFrame.AutoSize = True
        'Commented as is obsolete if no further processing is needed  
        'Selection.Comment.Shape.Select
        'Commented not to fix Comment Aspect Ratio
        'With Selection.ShapeRange       'Fix 2.5 aspect ratio
        '    .LockAspectRatio = msoFalse
        '    MaxSize = .Width / 2.5
        '    If MaxSize > .Height Then
        '        .Height = MaxSize
        '    Else
        '        .Width = .Height * 2.5
        '    End If
        'End With
        'Commented to neglect fonts
        'With Selection.Font
        '    .Bold = False
        '    .Name = "Times New Roman"
        '    .Size = 12
        'End With

        Acl.Comment.Visible = False
    End If
Next
InitRng.Select

End Sub