2014-12-02 161 views
0

对于这个问题的大范围和我可能创建的任何模糊情况,我都会提前道歉。我想要创建一个宏,它可以在表格中生成一个宏,并且如果在该行的不同列中满足特定条件而将另一个单元格值复制到另一个表中的表中。Excel VBA:将表格中的单元格值复制到另一张表上的表格,条件为

基本上,如果条件等于表A中列C中的X,则将表A中列B的数字复制到表B中的列B.存在2k +行。表A中的列C始终为空或等于X,并且表A中的列B从不为空,直到列表结束。表B中的列B是空白的,并且行数将由从表A复制到它的行的数量确定。

我确定这将需要一个循环,但是对于VBA来说是新的,我是不确定我需要哪种循环类型以及循环逻辑应该如何查看。我怀疑Do Until是最容易的,因为表A中没有空白,直到列表结尾。目前为止我的最佳猜测:

Dim wsPAPS As Range 
Dim wsPAVA As Range 
Dim wsVNPN As Range 
Dim wkATTR As Workbook 

Set wkATTR = Workbooks("PARCEL_ATTR_MACRO-TEST.xlsm") 
Set wsPAPS = Sheets("PARCEL_ATTR_BASE").Range("PARCELSTAT") 
Set wsPAVA = Sheets("PARCEL_ATTR_BASE").Range("APO_VA_Properties_Vacant_Abandoned") 
Set wsVNPN = Sheets("VA_NAME").Range("L1_PARCEL_NBR") 

Do 
    If wsPAVA = "Vacant/Abandoned" Then 
     wsVNPN = wsPAPS 
    End IF 
Loop Until wsPAPS = "" 

请注意,此代码实际上并不工作;我被告知我有一个没有做的循环,不知道为什么。

我会非常感谢任何帮助。谢谢,所有!

UPDATE带有Range变量的意图是试图使引用特定列变得容易,但我得到了一个应用程序定义或对象定义的错误。

+0

您需要使用DO WHILE(条件),然后在最后说,“循环” http://www.excelfunctions.net/VBA-Loops.html – peege 2014-12-02 23:41:16

回答

1

请遵循以下步骤,

  • 通过其范围(cSheetName)定义输出地址表/工作簿
  • 通过其范围定义源工作表/工作簿(cFileLocWS)

  • 取要执行的操作的行数可以高达100万行。

  • 添加循环不一定会做一个简单的“For”会做。

'开放日为 - 山口:S

' 现有逻辑== $ T $ 1-I(n)的1
“$ T $ -1 - 月 - 日的端

lRowCount = Sheets(cSheetName).Cells(Rows.Count, "I").End(xlUp).Row 
For rowIndex = 2 To lRowCount 
    mDate = Sheets(cFileLocWS).Range(cMonthEndDate).Value 
    strtDate = Sheets(cSheetName).Cells(rowIndex, "I").Value 
    lResult = (mDate - strtDate) + 1 
    Sheets(cSheetName).Cells(rowIndex, "S").Value = lResult 
Next rowIndex 

希望这有助于。

1

尝试这种情况:

假设片材的名称是:“表A”和“表B”和B列总是有一些数据。

Sub Copy() 
    Dim lr As Long, r As Long 
    Set Sh1 = ThisWorkbook.Worksheets("TableA") 
    Set Sh2 = ThisWorkbook.Worksheets("TableB")   

    lr = Sh1.Cells(Rows.Count, "B").End(xlUp).row 
    x = 2 
    For r = 2 To lr 
     If Range("C" & r).Value = "X" Then 'Evaluate the condition. 
      Sh2.Range("B" & x).Value = Sh1.Range("B" & r).Value 'ColumnB 
      x = x + 1 
     End If 
    Next r 
    Sh2.Select 
End Sub 
+0

为什么你选择的表? – peege 2014-12-03 00:44:24

+0

第一次选择不是必需的,但第二次只是为了显示结果。 – SkyMaster 2014-12-03 01:20:01

+0

感谢您的建议,SkyMaster。如果您愿意,我有几个问题:我在lr = Sh1.Cells(Rows.Count,“B”)上得到运行时(类型不匹配)错误。对此有何想法?另外,是否同时命名表和表同名(即表名PARCEL_ATTR_BASE,表名PARCEL_ATTR_base)是否存在问题? – MattCoats 2014-12-03 14:52:58