-2

我正在做很多手工工作,我尝试找到相关的宏,但不幸的是找不到任何宏。

基本上,我的 Excel 表有 4 列(A、B、C、D)。在对当月的公司文件进行大量筛选后,我在 A 列和 B 列中留下了数据(我删除了高于和低于我的范围的某些限制,我删除了与我所在行业无关的数据等)。

  • A列有公司名称(大写,小写,有时组合)

  • B列有日期(我现在按月做)

准备好这两列后,我会从网站运行网络查询,该查询会下载整个月提交给 SEC 的文件以及超链接。

  • C 列的公司名称带有 HYPERLINKS(不一定与 Col A 中的大小写格式相同)

  • D列有日期(我每月下载,所以这将是同一个月)

C 列的数据比 A 列多得多;它也有所有不受欢迎的公司的超链接,并且该网站上的搜索无法比目前的程度更加定制。

Col D 比 Col B 长得多,因为提交的文件更多

例如:

Col A   Col B        Col C          Col D
                     (Hyperlinks)
Abc     3/1/2008     AAA            3/1/2008
BCD     3/1/2008     AAB            3/1/2008
BCD     3/2/2008     AAC            3/1/2008 
cDE     3/2/2008     ABC            3/1/2008
DeF     3/3/2008     ABE            3/1/2008
                     BCD            3/1/2008
                     ABC            3/2/2008
                     BCD            3/2/2008
                     CDE            3/2/2008
                     AAA            3/3/2008
                     AAF            3/3/2008
                     DEF            3/3/2008

我需要 Col C 中的公司用其超链接替换 ​​Col A,前提是它们在同一日期(Col B = Col D),无论大小写如何(公司名称是唯一的)。

Col A 和 C 中公司的顺序不一样,即使我为这些列排序“AZ”,因为 Col C 中不需要的公司数据。C 列比 A 长得多。

每个月有 1200 到 1500 份文件,我正在手动检查并按日期手动替换。我必须这样做3年,过去10天我仍然在同一个月。还有更多:我必须打开每个文件并阅读并更新备注栏。

4

1 回答 1

1

我相信下面的代码可以满足您的需求。

我创建了此工作表以匹配您的图像:

图像前

下面的宏将工作表更改为:

在此处输入图像描述

C 列和 D 列现在是冗余的,因为这些列中的每个值都已移至 F 列和 G 列。

希望这可以帮助。

编辑

Meena 针对她的数据运行宏,但它没有匹配所有应该匹配的值。她通过电子邮件向我发送了一份她的数据副本。在检查了她的数据后,我对下面的宏进行了三处更改:

  • Meena 的工作表没有标题行。我使用一个常量来指定第一个数据行。我已将值从 2 更改为 1。
  • 许多参考值都有尾随空格。在比较之前,我使用 TRIM() 删除了那些尾随空格。
  • 该宏创建两个新的数据列。这些保留在默认宽度,因此如果值很长,它将换行并需要几行。我现在添加了将列宽从源列复制到目标列的代码。

.

 Option Explicit
  ' If the columns have to be moved, update these constants
  ' and the code will change to match.
  Const ColRefCompany As Long = 1
  Const ColRefDate As Long = 2
  Const ColWebCompany As Long = 3
  Const ColWebDate As Long = 4
  Const ColSaveCompany As Long = 6
  Const ColSaveDate As Long = 7
  Const ColLastLoad As Long = 4
  Const RowDataFirst As Long = 1        ' No header row
Sub CopyWebValuestoSaveColumns()

  Dim CellValue() As Variant
  Dim ColCrnt As Long
  Dim Rng As Range
  Dim RowRefCrnt As Long
  Dim RowSave() As Long
  Dim RowSaveCrnt As Long
  Dim RowWebCrnt As Long
  Dim RowLast As Long

  ' Find the last cell with a value
  With Worksheets("Sheet1")
    Set Rng = .Cells.Find(What:="*", After:=.Range("A1"), LookIn:=xlFormulas, _
                          LookAt:=xlWhole, SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious)

   If Rng Is Nothing Then
     Call MsgBox("Sheet is empty", vbOKOnly)
     Exit Sub
   End If
   RowLast = Rng.Row
   ' Load all reference and web values to CellValue.  Searching an array
   ' is faster than searching the worksheet and hyperlinks are converted
   ' to their display values which gives an easier comparison.
   ' Note for arrays loaded from a worksheet, dimension one is for rows
   ' and dimension two is for columns.
   CellValue = .Range(.Cells(1, 1), .Cells(RowLast, ColLastLoad)).Value

   ' RowSave() will record the position in the save columns of the values
   ' in the web columns.  Allow for one entry per row in web list.
   ReDim RowSave(1 To RowLast)

   RowRefCrnt = RowDataFirst

   ' Set web company names to lower case and remove leading and trailing
   ' spaces ready for matching
   For RowWebCrnt = RowDataFirst To RowLast
     CellValue(RowWebCrnt, ColWebCompany) = _
                               Trim(LCase(CellValue(RowWebCrnt, ColWebCompany)))
   Next

   Do While True
     If CellValue(RowRefCrnt, ColRefCompany) = "" Then
       ' Empty cell in reference company column.  Assume end of list
       Exit Do
     End If
     ' This loop makes no assumptions about the sequence of the
     ' Reference and Web lists.  If you know their sequences match or
     ' if you can sort the two pairs of columns, this loop could be
     ' made faster
     ' Set reference company name to lcase and remove leading and trailing
     ' spaces ready for matching
     CellValue(RowRefCrnt, ColRefCompany) = _
                              Trim(LCase(CellValue(RowRefCrnt, ColRefCompany)))

     For RowWebCrnt = RowDataFirst To RowLast
       If CellValue(RowRefCrnt, ColRefCompany) = _
                                      CellValue(RowWebCrnt, ColWebCompany) And _
          CellValue(RowRefCrnt, ColRefDate) = _
                                          CellValue(RowWebCrnt, ColWebDate) Then
         ' Reference and web values match.
         ' Record that the web values from row RowWebCrnt
         ' are to be copied to row RowRefCrnt
         RowSave(RowWebCrnt) = RowRefCrnt
         Exit For
       End If
     Next
     RowRefCrnt = RowRefCrnt + 1
   Loop
   RowSaveCrnt = RowRefCrnt     ' First row in save column that is available
                                ' for unused web values
   For RowWebCrnt = RowDataFirst To RowLast
     If RowSave(RowWebCrnt) = 0 Then
       ' The web values on this row has not been matched to reference values.
       ' Record these web values are to be moved to the next available row
       ' in the save columns
       RowSave(RowWebCrnt) = RowSaveCrnt
       RowSaveCrnt = RowSaveCrnt + 1
     End If
   Next

   .Columns(ColSaveCompany).ColumnWidth = .Columns(ColWebCompany).ColumnWidth
   .Columns(ColSaveDate).ColumnWidth = .Columns(ColWebDate).ColumnWidth

   ' Copy values from web columns to save columns
   For RowWebCrnt = RowDataFirst To RowLast
     .Range(.Cells(RowWebCrnt, ColWebCompany), _
            .Cells(RowWebCrnt, ColWebDate)).Copy _
                       Destination:=.Cells(RowSave(RowWebCrnt), ColSaveCompany)
   Next

  End With

End Sub
于 2012-05-09T18:20:34.707 回答