2012-10-19 11 views
6

Mam arkusz kalkulacyjny, który jest tworzony programowo z wieloma komentarzami (do 40 000). Komentarze zostaną zmniejszone po usunięciu kilku kolumn z arkusza roboczego. To najwyraźniej błąd w Excelu. (http://answers.microsoft.com/en-us/office/forum/office_2007-excel/excel-comment-boxes-resizing-themselves-andor/3fdf3e72-6ca5-4186-a656-b7b6fd8db781?msgId=d55534a5-4603-482e-ac97-9ec260124f78)Zmiana rozmiaru komentarzy w programie Excel za pomocą ShapeRange

Idealnie chciałbym AutoSize wszystkie komentarze naraz po usunięciu kolumn.

Próba uniknięcia zapętleń w poszczególnych komentarzach, oto, co próbowałem do tej pory.

  • Ustawienie AutoShapeDefaults nie ma wpływu - komentarze są nadal zmieniane po usunięciu kolumn.
  • Właściwość XlPlacement. XlMove i XLMoveAndSize nie mają żadnego efektu.
  • Worksheet.Shapes.SelectAll zgłasza wyjątek OutOfMemory bez względu na ilość komentarzy

Moja myśl jest, aby obiekt ShapeRange wszystkich uwag zawartych w arkuszu kalkulacyjnym i ustawić rozmiar stamtąd.

Działa to doskonale:

 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; 
     } 

Zmiana tego zgłasza wyjątek "wyjątek od HRESULT: 0x800A03EC" na linii autoSize.

 ShapeRange sRange = objSheet.Shapes.Range[test]; 
     sRange.TextFrame.AutoSize = true; 

Stosując mi rzeczywistego kształtu tablicy wskaźników zgłasza wyjątek tego samego ale Shapes.Range []. Sprawdziliśmy w kształtach zmiennej trakcie debugowania i jest identyczny testu wyjątkiem to Int [249] zamiast Int [5];

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

Może powinien to być odpowiedź, ale to nie jest odpowiedź, więc komentarze: [ShapeRange.TextFrame jest tylko do odczytu] (http://msdn.microsoft.com/en-us/library/ office/ff838224.aspx), więc aby zastosować autosize, będziesz musiał przejść przez tablicę. Zakładam, że coś musi być nie tak z kształtami int [] shapes = (int []). ToArray (typeof (int)); 'Ponieważ próbowałem replikować twoją metodę w VBA i mogłem z powodzeniem wygenerować ShapeRange z 50000 komentarzy natychmiast. Jednakże, jeśli spróbuję wybrać 50001 (z tylko 50000 kształtami), wystrzeliwuje ** ten sam błąd ** jak przy użyciu AutoSize. Upewnij się, że tablica jest poprawna. –

Odpowiedz

1

Cóż, odpowiem z kodem VBA, który musi zostać uruchomiony z poziomu modułu w Excelu. Z dyskusji i odpowiedzi here.

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 

przechowywane kod i komentarze nie są potrzebne. Nadal muszę uzupełnić scalone komórki, których nie można jeszcze obsłużyć.

okrzyki

Powiązane problemy