2015-08-25 39 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可以是工作表,工作簿,图表,范围或几乎任何其他可以指向并单击的东西 - 因此,当尝试访问属于特定对象或类的属性或方法时,可能会导致问题。

相关问题