繁体   English   中英

VBA宏可根据单元格内容将单元格移动到新的Excel表

[英]VBA macro to move cells to a new sheet Excel based on cell content

我环顾四周,找不到我需要的具体回复。 所以我会问。 我有一个工作表(sheet1),其数据仅在列A上。它看起来像这样:

在此处输入图片说明

我需要创建一个VBA宏,该宏在A列中搜索包含ID,TITL和AUTH的任何单元格。 并将它们移动到另一个工作表(sheet2)中的特定列。 Sheet2将包含3列:ID,标题和作者。

事实是,将单元格数据复制到sheet2中的特定列的同时,还需要删除数据的第一部分。 例如:工作表1中的ID:R564838需要移到工作表2中的ID列,而其中没有“ ID:”。 因此只需要移动R564838。 复制时,也需要删除“ TITL:”和“ AUTH:”。

我希望这是有道理的。 我只是在学习VBA宏。 所以我不知道如何实现这一目标。

更新

我有以下代码:

Sub MoveOver() 

Cells(1, 1).Activate 


While Not ActiveCell = "" 

    If UCase(Left(ActiveCell, 4)) = "  ID" Then Sheets(2).Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = _ 
    Trim(Mid(ActiveCell, InStr(1, ActiveCell, ":") + 1, Len(ActiveCell))) 'Move ID to Col A in sheet 2

    If UCase(Left(ActiveCell, 4)) = "TITL" Then Sheets(2).Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = _ 
    Trim(Mid(ActiveCell, InStr(1, ActiveCell, ":") + 1, Len(ActiveCell))) 'Move TITL to Col B in sheet 2

    If UCase(Left(ActiveCell, 4)) = "AUTH" Then Sheets(2).Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Value = _ 
    Trim(Mid(ActiveCell, InStr(1, ActiveCell, ":") + 1, Len(ActiveCell))) 'Move AUTH to Col C in sheet 2

    ActiveCell.Offset(1, 0).Activate 

Wend 

结束子

而且有效。 但是sheet1中有一些AUTH和TITL是空白的。 情况是,当它运行时,只要AUTH或TITL为空,它就不会留下一个空单元格。 如果AUTH或TITL为空白,则我需要宏将其留空单元格,以便每本书的信息都匹配。 希望您理解我的问题。

再次感谢你!

设置一些变量以确保您使用的是正确的工作簿/工作表/列

Set wb = ThisWorkbook
Set ws1 = wb.Sheets(1)
Set ws2 = wb.Sheets(2)
col = 1

查找列的最后一个单元格

last1 = ws1.Cells(ws1.Rows.Count, col).End(xlUp).Row

查看每个单元以弄清楚该如何处理

For x = 1 To last1
    'What you do with each cell goes here
Next x

评估单元格的内容(知道它是否包含特定内容)

If ws1.Cells(x, col) Like "*ID:*" Then
    'What you do with a cell that has "ID:" in it
End If

提取单元格感兴趣的内容(删除“标题”)

myID = Mid(ws1.Cells(x, col), InStr(ws1.Cells(x, col), "ID:") + Len("ID:"))

将内容放在第二张工作表的下一个可用行中(假设ID位于第1列)

current2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1
ws2.Cells(current2, 1) = myID

弄清楚如何将代码片段放在一起,使其适应您的确切需求!


在回答您的评论时:

基本上是的,但是您可能会遇到一些麻烦,因为它不能完全满足您的特定情况。 您可能需要做的是:

  1. 将ID(一旦找到)存储在变量中;
  2. 对标题和作者进行相同的操作;
  3. 找到定界线后,您将变量的当前内容写入下一个可用行,并清空这些变量的内容。

例如 :

If ws1.cells(x, col) Like "*----*" Then
    current2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row + 1
    ws2.Cells(current2, 1) = myID
    ws2.Cells(current2, 2) = myTitle
    ws2.Cells(current2, 3) = myAuthor
    myID = ""
    myTitle = ""
    myAuthor = ""
End If

干得好 :)

Sub MoveOver() 

Cells(1, 1).Activate 

myId = ""
myTitle = ""
myAuthor = ""

While Not ActiveCell = ""

    If UCase(Left(ActiveCell, 4)) Like "*ID*" Then myId = Trim(Mid(ActiveCell, InStr(1, ActiveCell, ":") + 1, Len(ActiveCell)))

    If UCase(Left(ActiveCell, 4)) = "TITL" Then myTitle = Trim(Mid(ActiveCell, InStr(1, ActiveCell, ":") + 1, Len(ActiveCell)))

    If UCase(Left(ActiveCell, 4)) = "AUTH" Then myAuthor = Trim(Mid(ActiveCell, InStr(1, ActiveCell, ":") + 1, Len(ActiveCell)))

    If ActiveCell Like "*---*" Then
        'NOW, MOVE TO SHEET2!
        toRow = Sheets(2).Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
        Sheets(2).Cells(toRow, 1) = myId
        Sheets(2).Cells(toRow, 2) = myTitle
        Sheets(2).Cells(toRow, 3) = myAuthor
        myId = ""
        myTitle = ""
        myAuthor = ""
    End If

    ActiveCell.Offset(1, 0).Activate

Wend

如果您需要帮助以了解我的更改,请告诉我,但这应该很简单!

您可能还想尝试使用以:为分隔符的文本到列。 这将使您的信息分成2列而不是1列,然后您可以在一列中搜索标题,然后复制下一个列的值(空白或其他)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM