在单个页面上整理重复的文本

时间:2015-01-14 18:59:22

标签: excel vba excel-vba

我正在使用Excel工作簿进行军事规划。规划过程向我介绍了各种标签上的一些问题;对这些问题的答案的分析导致任务,考虑,约束,对进一步信息的请求等。分析中的这些后果以缩写为前缀(T:用于任务; R:用于风险等)。我试图找到一种方法来整理掉落的所有出现并将它们整理到同一工作簿中的单独选项卡中,以便通过每个选项卡保存拖网回复以复制和粘贴它们。有没有办法设置一个宏,用前缀搜索单元格内容,并将整个单元格数据从一个选项卡复制到另一个选项卡?

前缀如下:

A: 
R:
C:
E:
T:
PG: 
FQ:
CL:
RFI:
D/W: 
CCIR:
EEFI:
PIR:
NIR:
RFC:

任何人都可以帮助我吗?我不知道什么时候编写脚本。

2 个答案:

答案 0 :(得分:0)

答案“有没有办法设置宏......?”几乎可以肯定是“是”,但有一个模糊的问题是不可能的。

这个网站在这里,所以程序员可以互相帮助开发。我已经看到初学者成长为有用的回答者,即使是最有天赋的常客也会偶尔提出问题。但这不是一个免费的编码网站;你来之前必须努力解决自己的问题。

如果你对VBA一无所知,你不能指望理解你在这里找到的代码片段。学习VBA的基础知识将很快回报自己。搜索“Excel VBA教程”。有很多可供选择,所以尝试一些,然后完成一个符合您的学习风格。我更喜欢书。我访问了我当地的图书馆,借了一些Excel VBA Primers然后买了我喜欢的那个。十二年后,我偶尔也会提到它。

您的问题意味着这些带前缀的字符串分散在主工作表中。您想要找到以“XYZ:”开头的所有字符串,并将它们复制到工作表XYZ。

我相信任何教程或书籍都会教你如何使用Find。他们还将向您展示如何将数据从一个工作表移动到另一个工作表。他们可能不会做的是告诉你如何搜索“A:”然后“R:”然后“C:”等等,以尽量减少努力。我将通过展示如何使用一组工作簿来开始。

下面的宏检查每个工作表是否存在,如果它们尚不存在则创建它们。在你掌握了VBA的基础知识之前,我怀疑你会理解很多代码。我要你注意的是,相当一小段代码可以有选择地创建19个工作表。

您想要的宏将具有类似的结构,但Err.ClearEnd If的语句将被一个块替换,如下所示:

  • 搜索主表第一次出现(如果有)当前前缀
  • 如果发现事件,则将每次出现的循环复制到相关工作表的A列中的下一个空闲行。

Option Explicit
Sub CreateWorksheets()

  Dim ErrNum As Long
  Dim InxP As Long
  Dim PrefixCrnt As Variant
  Dim Prefixes() As Variant
  Dim Wsht As Worksheet
  Dim WshtName As String

  Application.ScreenUpdating = False

  Prefixes = Array("A", "R", "C", "E", "T", "PG", "FQ", "CL", "RFI", _
                   "D/W", "CCIR", "EEFI", "PIR", "NIR", "RFC")

  ' For each prefix in Prefices, create a worksheet with
  ' this name if it does not already exist.

  For InxP = LBound(Prefixes) To UBound(Prefixes)

    PrefixCrnt = Prefixes(InxP)
    ' Remove characters that cannot be present in a worksheet name
    WshtName = Replace(PrefixCrnt, "/", "-")

    Err.Clear                   ' Clear record of any past error
    On Error Resume Next        ' Switch off normal error handling
    Set Wsht = Worksheets(WshtName)
    ErrNum = Err.Number         ' Save error number
    On Error GoTo 0             ' Restore normal error handling
    If ErrNum <> 0 Then
      ' Worksheets(wshtname) does not exist
      ' Create new worksheet and place after all existing worksheets
      Worksheets.Add After:=Worksheets(Worksheets.Count)
      ' New worksheet is now active workbook
      ActiveSheet.Name = WshtName   ' Rename new worksheet
    End If

  Next InxP

  Application.ScreenUpdating = True

End Sub

答案 1 :(得分:0)

好的Ben,尽管@Tony Dallimore给出的建议我认为对于没有VBA经验的人来说这是一个相当大的挑战,我对这个要求的解释也略有不同,因此这个提议的答案。我会给你一些基本代码,从中学习一点,希望你能修改如下所示。

对于此示例,我假设已将一个名为“Summary”的空白表(已显示标题)添加到工作簿中。您可以使用Tony的答案作为基础,如果它不存在则自动提供,或者如果它已经存在则将其删除。

enter image description here

然后,下面的代码将使用下水道的表格标题(col A),下水道的行/ col位置(col B)以及所请求的下水道的单元格内容(col C)填充此表格。您可以修改代码以将前缀拆分为单独的coll吗?我使用Q1,Q2,Q3作为工作表名称和数据,它将前缀与工作表名称组合在一起构成了后果文本,例如。 “CCIR:Q3”

正如托尼所说,在没有数据/布局的情况下,这是我在第一张表中使用的简单数据的一个例子:

enter image description here

我的代码使用两个名为Range.Find的{​​{1}}方法。要查找值(您的前缀),它们需要是唯一可识别的。在你的前缀列表中,搜索“R:”也会找到“CCIR:”,“PIR:”和“NIR:”;类似地搜索“C:”也会找到“RFC:”。这很麻烦,因此我将前缀分别修改为“RR:”和“CC:”。您需要决定是更改前缀以反映此前缀还是使用其他基础来定位前缀。

.FindNextFind需要一些理解,所以或许看看Siddarth Rout's excellent summary here.

您也可以考虑从here开始研究FindNext

将以下代码示例复制并粘贴到普通代码模块中并运行ReportPrefixes - 您可能需要学习如何执行此操作。有一个名为Worksheet.UsedRange的'主'子组件和一个名为Sub ReportPrefixes()的名为Sub的子组件。它们可以粘贴在同一个代码模块中。

Sub addFallout()