2016-03-18 104 views
2

我在尋求一些幫助。我有一個代碼能夠完成我所需要的功能,並且工作得很好,但是我想讓它做更多的工作,並且在發生故障時進行。 下面是代碼,有點亂,我知道:Excel VBA在將單元格樣式應用於單元格時出現錯誤

Sub AgainstAbstain() 

    Application.ScreenUpdating = False 

    'Stating variables 
    Dim Abstain As String 
    Abstain = "Abstain" 
    Dim Against As String 
    Against = "Against" 
    Dim C11 As Variant 

    'Enter amount of votable items 
    Dim e As Byte 'number of agenda items 
    e = InputBox("Number of votable items in Agenda?") 

    'Create Necessary sheets 
    On Error Resume Next 
    Sheets("Abstain").Delete 
    'Sheets("Against").Delete 
    On Error GoTo 0 
    ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count) 
    'ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count) 
    ActiveWorkbook.Sheets(2).Name = "Abstain" 
    'ActiveWorkbook.Sheets(3).Name = "Against" 

    'Change zoom level of sheets 
    Sheets(2).Activate 
    ActiveWindow.Zoom = 85 
    'Sheets(3).Activate 
    'ActiveWindow.Zoom = 85 
    Sheets(1).Activate 

    'For better copying of cells 
    Cells.WrapText = False 

    'To count spaces 
    Dim j As Integer 
    j = 1 
    Dim k As Integer 
    k = 1 
    Dim c As Integer 
    c = 3 ' 

    'Main filter and copy 
    For i = 1 To e 
    Worksheets(1).Cells(11, c).Select 
    C11 = ActiveCell.Value 
    'Range("A11:C11").Select 
    Range(Cells(11, 1), Cells(11, c)).Select 
    Selection.AutoFilter 
    ActiveSheet.Range("C:C").AutoFilter Field:=c, Criteria1:="ABSTAIN" 

    'Amount of items visible after filter 
    Dim x As Integer 
    x = Application.Subtotal(3, Columns("A")) - 19 
    'MsgBox x 

    If x > 0 Then 
    ActiveSheet.AutoFilter.Range.Offset(1).Copy 
     Sheets("ABSTAIN").Activate 
    ' Range("A" & j).Select 
    ' Range("A" & j).Font.Bold = True 
    ' Range("A" & j).Font.Underline = True 
     Range("A" & j).Value = C11 & ") " & Abstain 
     j = j + 2 
    ' Range("A" & j).Select 
     Range("A" & j).Value = "Beneficial owner:" 
     'Range("A" & j).Font.Bold = True 
     Range("B" & j).Value = "Number of shares:" 
     'Range("A" & j).Font.Bold = True 
     j = j + 1 
     Sheets(2).Range("A" & j).PasteSpecial 
    ' Range("A" & j).Select 
    ' ActiveSheet.Paste 
     j = j + x 
     Range("A" & j).Value = "Sum" 
     Range("A" & j).Font.Bold = True 
     Range("A" & j).Interior.Color = RGB(255, 204, 153) 
     Range("B" & j).Font.Bold = True 
     Range("B" & j).Interior.Color = RGB(255, 204, 153) 
     j = j + 3 
     Columns(3).EntireColumn.Delete 
     Err.Clear 
     Sheets(1).Activate 
     Worksheets(1).Columns(c).Hidden = True 
     c = c + 1 
     Cells.AutoFilter 
     Else: Cells.AutoFilter 
     Worksheets(1).Columns(c).Hidden = True 
     c = c + 1 
    End If 
    Next i 

    Cells.EntireColumn.Hidden = False 
    c = 3 

    For i = 1 To e 
    Worksheets(1).Cells(11, c).Select 
    C11 = ActiveCell.Value 
    'Range("A11:C11").Select 
    Range(Cells(11, 1), Cells(11, c)).Select 
    Selection.AutoFilter 
    ActiveSheet.Range("C:C").AutoFilter Field:=c, Criteria1:="AGAINST" 

    'Amount of items visible after filter 
    Dim y As Integer 
    y = Application.Subtotal(3, Columns("A")) - 19 
    'MsgBox y 

    If y > 0 Then 
    ActiveSheet.AutoFilter.Range.Offset(1).Copy 
     Sheets("Abstain").Activate 
    ' Range("A" & j).Select 
     Range("A" & j).Value = C11 & ") " & Abstain 
     j = j + 2 
    ' Range("A" & j).Select 
     Range("A" & j).Value = "Beneficial owner:" 
     Range("B" & j).Value = "Number of shares:" 
     j = j + 1 
     Sheets(2).Range("A" & j).PasteSpecial 
    ' Range("A" & j).Select 
    ' ActiveSheet.Paste 
     j = j + y 
     Range("A" & j).Value = "Sum" 
     Range("A" & j).Font.Bold = True 
     Range("A" & j).Interior.Color = RGB(255, 153, 204) 
     Range("B" & j).Font.Bold = True 
     Range("B" & j).Interior.Color = RGB(255, 153, 204) 
     j = j + 3 
     Columns(3).EntireColumn.Delete 
     Err.Clear 
     Sheets(1).Activate 
     Worksheets(1).Columns(c).Hidden = True 
     c = c + 1 
     Cells.AutoFilter 
     Else: Cells.AutoFilter 
     Worksheets(1).Columns(c).Hidden = True 
     c = c + 1 
    End If 

    'If y > 0 Then 
    'ActiveSheet.AutoFilter.Range.Offset(1).Copy 
    ' Sheets("AGAINST").Activate 
    ' Range("A" & k).Select 
    ' Range("A" & k).Value = C11 & ") " & Against 
    ' k = k + 2 
    ' Range("A" & k).Select 
    ' Range("A" & k).Value = "Beneficial owner:" 
    ' k = k + 1 
    ' Range("A" & k).Select 
    ' ActiveSheet.Paste 
    ' k = k + y 
    ' Range("A" & k).Value = "Sum" 
    ' k = k + 3 
    ' Columns(3).EntireColumn.Delete 
    ' Err.Clear 
    ' Sheets(1).Activate 
    ' Cells.AutoFilter 
    ' 'Columns(3).EntireColumn.Delete 
    ' Worksheets(1).Columns(c).Hidden = True 
    ' c = c + 1 
    'Else: Cells.AutoFilter 
    ' 'Columns(3).EntireColumn.Delete 
    ' Worksheets(1).Columns(c).Hidden = True 
    ' c = c + 1 
    'End If 

    Next i 

    Sheets(2).Activate 
     For Each NumRange In Columns("B").SpecialCells(xlConstants, xlNumbers).Areas 
      SumAddr = NumRange.Address(False, False) 
      NumRange.Offset(NumRange.Count, 0).Resize(1, 1).Formula = "=SUM(" & SumAddr & ")" 
      c = NumRange.Count 
     Next NumRange 
    NoData: 
    'Sheets(2).Select 
    Columns("A:B").AutoFit 
    Sheets(1).Activate 

    Cells.EntireColumn.Hidden = False 
    Application.ScreenUpdating = True 

End Sub 

它過濾和移動數據就好了。但是,當我嘗試激活這部分

' Range("A" & j).Font.Bold = True 
' Range("A" & j).Font.Underline = True 

它給了我這個錯誤 運行時錯誤「1004」:失敗的Range類 PasteSpecial方法。事實上,如果我在粘貼之前嘗試激活任何樣式更改,則會出現此錯誤。 並突出顯示此區域

Sheets(2).Range("A" & j).PasteSpecial 

我只是不明白。

+1

你見過[如何避免在Excel中VBA宏使用Select(HTTP:/ /stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)? – Jeeped

+0

代碼開始做所有事情都棄權和反對,然後突然放棄,只能用棄權。你是否試圖對這兩種或只有一半的東西做同樣的事情? – Jeeped

+0

@Jeeped感謝您的鏈接,我會看看它。起初宏指令應該通過棄權然後通過反對來過濾所有的東西。它工作正常,直到我試圖使一些單元格粗體。那就是它剎車的地方。 – Dzago

回答

0

在.Copy方法之後,您需要立即粘貼結果。做其他任何事情都會清空複製緩衝區,所以這將工作:

ActiveSheet.Range("A1").Copy 
ActiveSheet.Range("A2").PasteSpecial 
ActiveSheet.Range("A1").Font.Size = 10 

但這不是將

ActiveSheet.Range("A1").Copy 
ActiveSheet.Range("A1").Font.Size = 10 
ActiveSheet.Range("A2").PasteSpecial 
+0

重新排列一些代碼,現在它可以工作。謝謝! – Dzago