【问题标题】:Excel copy columns based on a conditionExcel 根据条件复制列
【发布时间】:2015-10-11 04:04:54
【问题描述】:

您好,我有一个电子表格,我需要从中提取一些数据并将其复制到新工作表中。

下面是电子表格的图片。我想要的是当 M 列和 N 列包含数字时,新工作表中所有黄色突出显示的列的副本(在这种情况下,第二个工作表上只有 2 个 - 第 7 行和第 26 行)。这张表很大,所以这只是一个示例。

Here is the code I have tried to use:

    Sub CopyYesAdrian()
Dim a As Variant, o As Variant
Dim i As Long, j As Long, n As Long
Application.ScreenUpdating = False
With Sheets("Sheet1")
  a = .Cells(1, 1).CurrentRegion
  n = Application.CountIf(.Columns(9), "Yes")
  ReDim o(1 To n + 1, 1 To 11)

End With
j = j + 1: o(j, 1) = "CORP ID": o(j, 2) = "Application ID"
o(j, 3) = "Orig - Country": o(j, 4) = "Network DDI": o(j, 5) = "PTT ACCESS": 
  o(j, 6) = "TERM - COUNTRY": o(j, 7) = "TERM SW/TRUNK"
: o(j, 8) = "TERM DIGITS": o(j, 9) = "PSTN ROUTE": o(j, 10) = "PLAN": o(j,  
11) = "DNIS"
For i = 2 To UBound(a, 1)
If IsError(a(i, 6)) Then

 ElseIf a(i, 8) = "Yes" And a(i, 6) Like "[0-9][0-9][0-9][/][0-9]*" Then
    j = j + 1: o(j, 1) = a(i, 1): o(j, 2) = a(i, 3)
    o(j, 3) = a(i, 4): o(j, 4) = a(i, 6): o(j, 5) = a(i, 8):  o(j, 6) = a(i,   
9):  o(j, 7) = a(i, 10):  o(j, 8) = a(i, 11)
:   o(j, 9) = a(i, 12):   o(j, 10) = a(i, 12):   o(j, 11) = a(i, 12)
  End If
Next i
With Sheets("Sheet2")
  .UsedRange.Clear
  .Cells(1, 1).Resize(UBound(o, 1), UBound(o, 2)) = o
  .UsedRange.Columns.AutoFit
  .Activate
End With
Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 首先,到目前为止,您尝试了什么?您建议使用 VBA,但您对使用 VBA 感到满意吗?请显示您尝试过的代码,并显示它未能完成您想要/期望的操作。然后,澄清一下:如果 M 列是一个数字,那么 N 列也总是一个数字吗?反之亦然?
  • 抱歉,由于某种奇怪的原因,我无法将代码放在一个块中。不,它们可能并不总是一个数字。有时它们中有字符串,但我只想在它们都有数字时提取。
  • @grade 点失败是 o(j, 1) = a(i, 1) 它在 elseif 语句中。某些字段不在图像中,缺少的重要 1 是列 F,其中包含列 M 和 N 的串联值(当两者都有数字时)
  • 我建议您重新格式化您的代码,以便采取的每个操作都在自己的行中,而不是组合这么多语句;我无法真正解析你试图用那个代码块做什么。另外 - 在“失败点”会发生什么。有错误吗?什么错误?如果不是,您不会想到哪些值?您是否逐行运行代码以确保变量符合您的预期?
  • @Grade 我得到的错误是下标超出范围。

标签: excel vba


【解决方案1】:

用这个替换你的多语句行:

j = j + 1
o(j, 1) = "CORP ID"
o(j, 2) = "Application ID"
o(j, 3) = "Orig - Country"
o(j, 4) = "Network DDI"
o(j, 5) = "PTT ACCESS"
o(j, 6) = "TERM - COUNTRY"
o(j, 7) = "TERM SW/TRUNK"
o(j, 8) = "TERM DIGITS"
o(j, 9) = "PSTN ROUTE"
o(j, 10) = "PLAN"
o(j, 11) = "DNIS"
For i = 2 To UBound(a, 1)
If IsError(a(i, 6)) Then

 ElseIf a(i, 8) = "Yes" And a(i, 6) Like "[0-9][0-9][0-9][/][0-9]*" Then
    j = j + 1
    o(j, 1) = a(i, 1)
    o(j, 2) = a(i, 3)
    o(j, 3) = a(i, 4)
    o(j, 4) = a(i, 6)
    o(j, 5) = a(i, 8)
    o(j, 6) = a(i, 9)
    o(j, 7) = a(i, 10)
    o(j, 8) = a(i, 11)
    o(j, 9) = a(i, 12)
    o(j, 10) = a(i, 12)
    o(j, 11) = a(i, 12)
End If

请试试这个,让我知道它是否有效。

【讨论】:

  • 当我可以测试时,我会告诉你我的结果。您认为不使用 vba 就可以做我正在寻找的事情吗?
【解决方案2】:

这可以在没有 VBA 的情况下完成(在一定程度上)。

  • 在工作表 2 的单元格 A2 中键入以下公式: =IF(AND(ISNUMBER(Sheet1!$M2),ISNUMBER(Sheet1!$N2)),Sheet1!I2,"")

  • 将此公式复制/粘贴到单元格 B2:H2 中。

  • 删除 C 列(它指的是 Sheet1 中的 K 列,你不希望这样)。
  • 选择整行公式并复制工作表 1 中的行数。

这会让你得到你在问题中提出的问题,但我假设你会想要从那里整理出空白行。在这种情况下,您可能希望将 Sheet2 制作成表格,以便过滤掉空白行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多