2017-02-17 39 views
0

宏的工作我在網上拉到這個代碼,我是小白,但我已經做了一些改動的循環。請幫助我!我想讓這個宏在其他工作表上工作,並保存到宏功能區。我已經將它添加爲加載項,檢查了安全設置,檢查了工具>引用。問題是如果我將它作爲模塊保存在我想要拆分的excel文件下,它可以工作,但是如果我將它保存在空白工作表中並將其作爲宏來提取,這是我的團隊使用的目標,宏拉空白原稿並將主人打破一半;保持活動頁面不變。如何讓我對其他的Excel工作表

Sub Macrosplittest() 
    Dim Sht As Worksheet 
    Dim fName As String 
    Dim ShtCountBk1 As Integer 
    Dim ws As Worksheet 
    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 
    ShtCountBk1 = IIf(ActiveWorkbook.Sheets.Count Mod 2 = 1, Sheets.Count 
/2 + 0.5, Sheets.Count/2) 
    Set neww = Workbooks.Add 
    For Each Sht In ActiveWorkbook.Worksheets 
     i = i + 1 
     If i > ShtCountBk1 Then 
      fName = Replace(ThisWorkbook.Name, ".xls", "") 
      neww.SaveAs ThisWorkbook.Path & "\" & fName & " (1).xls" 
      Set neww = Workbooks.Add 
      i = 1 
     End If 
     Sht.Copy after:=Worksheets(neww.Sheets.Count) 
     If i = 1 Then 
      For Each ws In Worksheets 
       If ws.Name <> Sht.Name Then 
        ws.Delete 
       End If 
      Next ws 
     End If 
    Next Sht 
    fName = Replace(ThisWorkbook.Name, ".xls", "") 
    neww.SaveAs ThisWorkbook.Path & "\" & fName & " (2).xls" 
    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 
End Sub 
+0

看起來你有,你說「ShtCountNk1 = IIF(ActiveWorkbook ...」)一個錯字,我相信你只是想「如果(ActiveWorkbook ...」。此外,從我可以告訴,你正在創建一個新的工作簿(從而激活它),然後遍歷新的工作簿的工作表,這是否意味着什麼?對我來說,這似乎很奇怪,因爲一個新的工作簿應該只有一個工作表,你想用這個代碼完成什麼?很難看到你的目標。 –

+0

http://www.excelfunctions.net/vba-iif-function.html>有人告訴我,IIF是一個嵌套函數。我的目標是說200張,分爲兩個100張分裂一個大文件。平時總變化,有時是210,222,255,取決於我們收到的數據。 –

+0

我現在明白,我沒有任何線索,即使存在,我學到新的東西!我貼你的代碼的修改版本,但我不當然,如果你是這樣的話,這將會做到意味着將文件分成兩半。你需要分開Odd's和evens嗎?例如,對於6張紙,它必須是(1,3,5)和(2,4,6),或者它可以是(1,2,3)(4,5,6),它們被髮送到新的工作簿? –

回答

1

試試這個,我想我明白你正在嘗試做的:

Sub Macrosplittest() 
     Application.ScreenUpdating = False 
     Application.DisplayAlerts = False 

     Dim Sht As Worksheet 
     Dim fName As String 
     Dim ShtCountBk1 As Integer 
     Dim ws As Worksheet 

     Dim wbActive as Workbook 

     Dim newBook as Workbook 

     Dim lHolder as Long 
     Dim sHolder as String 

     Dim i as Long 

     Set wbActive = ActiveWorkbook 

     lHolder = wbActive.Sheets.Count 

     If lHolder Mod 2 = 1 Then 
      ' This should evaluate just fine without parentheses, but I 
      ' prefer to have the parentheses to make the code clear 
      ShtCountBk1 = (lHolder/2) + .05 
     Else 
      ShtCountBk1 = lHolder/2 
     End IF 

     Set newBook = Workbooks.Add 

     For Each Sht In wbActive.Worksheets 
      i = i + 1 
      Sht.Name = "SHT-" & Sht.Name 
      sHolder = Sht.Name 

      If i > ShtCountBk1 Then 
       fName = Replace(wbActive.Name, ".xls", "") 
       newBook.SaveAs wbActive.Path & "\" & fName & " (1).xls" 
       Set newBook= Workbooks.Add 
       i = 1 
      End If 

      Sht.Copy after:=Worksheets(newBook.Sheets.Count) 

      If i = 1 Then 
       For Each ws In Worksheets 
        If ws.Name <> sHolder Then 
         ws.Delete 
        End If 
       Next ws 
      End If 

     Next Sht 

     fName = Replace(wbActive.Name, ".xls", "") 
     newBook.SaveAs wbActive.Path & "\" & fName & " (2).xls" 

    Application.DisplayAlerts = True 
    Application.ScreenUpdating = True 
End Sub 

我已經做了一些修改,以使代碼更易於閱讀,並使其正確引用的工作簿你正在瞄準。最好避免ActiveWorkbook,因爲這可能會導致錯誤。另外,ThisWorkbook將引用運行代碼的工作簿。我不確定當加載項調用ThisWorkbook時是否會正確引用activeworkbook,但最好謹慎一點。

+0

有趣的是,它更容易閱讀。我遇到了問題,因爲我收到了424個對象錯誤。它似乎與字符串的持有人和持有人。 –

+0

你在哪裏得到錯誤?只有sHolder是一個字符串。 lHolder是Long(一個可以存儲大量值的數字)。 –

+0

lHolder = wb.Sheets.Count –

相關問題