2015-08-25 43 views
1

我試圖創建一個數據庫,它將從主工作簿中複製選定範圍的數據並將其複製到單獨的工作簿中。從一個工作簿中複製選定的單元格並將其複製到另一個

導致該問題的代碼如下。第二個工作簿基於「W2」的值打開。新的行應插入到新的Wb中,然後格式化,然後粘貼所選單元格的值。

'Select data to be copied 
ActiveCell.Resize(1, 4).Copy 

'Open Lessons Learned Db 
Location = Range("W2").Value 
Set Lessons = Workbooks.Open(Location) 
Set LL = Sheets("Lessons Learned") 
Windows("Lessons Learned Database.XLSM").Activate 
Sheets("Lessons Learned").Activate 

'Insert New Row 
Range("5:5").Activate 
ActiveCell.Offset(1).EntireRow.Insert 
'Enter Odd Or Even VALUE 
    Range("A7").Select 
    OE = ActiveCell.Value 
    If OE = 1 Then 
     Range("A6").Select 
     ActiveCell.FormulaR1C1 = 0 
    Else 
     Range("A6").Select 
     ActiveCell.FormulaR1C1 = 1 
    End If 

'Hide Permanently Hidden Rows -LINE BELOW GIVES ERROR 1004 
    Rows("5:5").Select 
    Selection.EntireRow.Hidden = True 
    Columns("A").Select 
    Selection.EntireColumn.Hidden = True 
'FORMAT ROW 
    Range("A6").Select 
    SC = ActiveCell.Value 
     If SC = 1 Then 
    Range("B6:N6").Select 
    With Selection.Interior 
     .ColorIndex = 15 
     .Pattern = xlSolid 
     .PatternColorIndex = xlAutomatic 
    End With 

End If 
Range("B5").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

任何指向我要去哪裏錯誤的指針將不勝感激。

回答

1

建議不要使用.Select.Activate,因爲還有其他方法可以實現此目的。
因爲您選擇並激活這可能導致ERROR 1004

下面我已經「清理」了您的代碼,定義了Lessons,LLLocation,幷包含了MainWB並定義了您的範圍。

通過定義您的Excel Range總會得到來自Range.Value有那麼沒有必要使用.Select.Activate

至於測試下面的代碼工作:

Sub CopyMainWBtoNewWB() 

Dim Lessons As Workbook 
Dim LL As Worksheet 
Dim MainWB As Workbook 
Dim Location As String 

Set MainWB = Workbooks("Name Here") 

'Open Lessons Learned Db 
Location = MainWB.Sheets("Sheet Name").Range("W2").Value 
Set Lessons = Workbooks.Open(Location) 
Set LL = Lessons.Sheets("Lessons Learned") 

'Insert New Row 
LL.Rows(5).Offset(1).EntireRow.Insert shift:=xlDown 

'Enter Odd Or Even VALUE 
If LL.Range("A7").Value = 1 Then 
    LL.Range("A6").Value = 0 
Else 
    LL.Range("A6").Value = 1 
End If 

'Hide Permanently Hidden Rows -LINE BELOW GIVES ERROR 1004 
LL.Rows(5).Hidden = True 
LL.Columns(1).Hidden = True 

'FORMAT ROW 

If LL.Range("A6").Value = 1 Then 
    With LL.Range("B6:N6").Interior 
     .ColorIndex = 15 
     .Pattern = xlSolid 
     .PatternColorIndex = xlAutomatic 
    End With 
End If 
MainWB.Sheets("Sheet1").Range("A1:A4").Copy 
LL.Range("B5").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ 
SkipBlanks:=False, Transpose:=False 
End Sub 

所有你需要做的是改變的MainWBWorkbook名稱和Sheet名其收集ValueLocation

1

我懷疑你的代碼有代碼審查或許可以幫助,但回答你的問題的一些其他問題:

Rows("5:5").Select被傳遞了錯誤的參數的數據類型。

Worksheet.Rows()正在等待一個數字,既可以是整數也可以是長數據類型,但是您要給它一個字符串。

更改爲Rows(5)它應該工作。

+1

這是VBA「鬆散打字」方面的一個很好的例子。該代碼行將工作。 VBE的立即窗口中的?行(「5:5」)。地址會返回'$ 5:$ 5'。 – Jeeped

+0

@Jeeped,你在兩方面都是正確的。我應該測試而不是跳進去。所以我不能產生'1004應用程序定義或對象定義的錯誤'條件。我錯過了什麼? –

+0

我試圖理解代碼,但我真的只考慮非選擇/激活條款,所以我將不得不重寫它。由於沒有任何跡象表明[ActiveCell屬性](https://msdn.microsoft.com/en-us/library/office/ff193314.aspx)在代碼的開頭,我嘗試過的任何東西都是一個鏡頭在黑暗中,所以我鞠躬。 – Jeeped

1

這都可以合併爲:

ActiveCell.Resize(1, 4).Copy '// not sure what this is for 

Set Lessons = Workbooks.Open([w2]) 
Set LL = Lessons.Sheets("Lessons Learned") 

With LL 
    .Rows(6).EntireRow.Insert 
    .Range("A6").value = IIf(.Range("A7").value = 1, 0, 1) 
    .Rows(5).Hidden = True 
    .Columns("A").Hidden = True 
     If .Range("A6").value = 1 Then 
      With .Range("B6:N6").Interior 
       .ColorIndex = 15 
       .Pattern = xlSolid 
       .PatternColorIndex = xlAutomatic 
      End With 
     End If 
    .Range("B5").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 
End With 

你會發現,這個代碼直接指的是每個對象不激活或選擇它。以這種方式編碼意味着每個對象都是完全合格的,並且您確切知道您正在使用哪個實例。

這應確保該行無誤地正確隱藏,因爲您指的是Rows集合,該集合是具有定義的屬性和方法的Ranges的集合。 Selection可以是工作表,工作簿,圖表,範圍或幾乎任何其他可以指向並單擊的東西 - 因此,當嘗試訪問屬於特定對象或類的屬性或方法時,可能會導致問題。

相關問題