单双数网址数据表格整理 cover image

单双数网址数据表格整理

想要实现的效果

A1:网址a的名称
A2:www.a.com
A3:网址b的名称
A4:www.b.com
Excel 我想改成:
C1:网址a D1:www.a.com
C2:网址b的名称 D2:www.b.com

单数行是标题,双数行是网址,现在要把它们配对到一行两列。


假设你的数据在 A 列(从 A1 开始):

=INDEX($A:$A,ROW()*2-1)

意思:取第 1、3、5… 行(单数行,名称)

=INDEX($A:$A,ROW()*2)

意思:取第 2、4、6… 行(双数行,网址)

然后向下拖动公式,直到结束。

得到:

C1   D1
C2   D2

这种两列结构。

最后:

  • 复制 C、D 列
  • 选择性粘贴 → 值
  • 删除原来的 A 列

原理

标准的 Excel INDEX 公式,只是看起来像“程序语言”而已。

我们一步步拆开你就能看出它的运算逻辑。


=INDEX($A:$A, ROW()*2-1)

意思是:

在 A 列中,取第 ROW()*2-1 行的值。

假设你在 C1 里写这个公式:

  1. ROW()
    • 返回当前单元格所在的行号。
    • 在 C1 里,它返回 1;在 C2 里,它返回 2;以此类推。
  2. ROW()*2
    • 把行号乘以 2。
    • 在 C1 → 1*2 = 2
    • 在 C2 → 2*2 = 4
    • 在 C3 → 3*2 = 6
  3. ROW()*2-1
    • 在上一步结果的基础上减去 1。
    • C1 → 2 - 1 = 1(取 A 列第 1 行)
    • C2 → 4 - 1 = 3(取 A 列第 3 行)
    • C3 → 6 - 1 = 5(取 A 列第 5 行)
  4. INDEX($A:$A, n)
    • INDEX(范围, 行号) 会返回范围中第 n 行的值。
    • 在 C1,它等价于 INDEX($A:$A, 1) → 取 A1
    • 在 C2,它等价于 INDEX($A:$A, 3) → 取 A3
    • 在 C3,它等价于 INDEX($A:$A, 5) → 取 A5

因为 ROW()*2-1 这个公式,会生成 1, 3, 5, 7, … 这样的行号序列,自然就只取到原表的单数行。


稍稍进阶版:

写个一键 VBA 宏,让它直接把 A 列改成两列配对好的表格,省去手动拖公式的步骤。


Sub ConvertNameUrlToTwoColumns()
    Dim lastRow As Long, targetRow As Long, i As Long

    ' 找到 A 列最后一行
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    targetRow = 1
    For i = 1 To lastRow Step 2
        ' 单数行放到 CCells(targetRow, 3).Value = Cells(i, 1).Value
        ' 双数行放到 DCells(targetRow, 4).Value = Cells(i + 1, 1).Value
        targetRow = targetRow + 1
    Next i

    MsgBox "转换完成!结果在 C、D 列", vbInformation
End Sub

  1. Alt + F11 打开 VBA 编辑器
  2. 菜单 → 插入 → 模块,把上面代码粘贴进去。
  3. 关闭 VBA 编辑器。
  4. 回到 Excel,按 Alt + F8,选择 ConvertNameUrlToTwoColumns运行

运行后:

  • 会自动把 A 列的单数行(名称)放到 C 列
  • A 列的双数行(网址)放到 D 列
  • 原数据不会被覆盖,你可以确认无误后删除 A 列

VBA 宏原地修改版

运行后数据会直接变成两列,旧的 A 列交错行会被清理掉。


Sub ConvertNameUrlInline()
    Dim lastRow As Long, targetRow As Long, i As Long

    Application.ScreenUpdating = False

    ' 找到 A 列最后一行
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    targetRow = 1
    For i = 1 To lastRow Step 2
        ' 名称放到 ACells(targetRow, 1).Value = Cells(i, 1).Value
        ' 网址放到 BCells(targetRow, 2).Value = Cells(i + 1, 1).Value
        targetRow = targetRow + 1
    Next i

    ' 清理多余的旧数据
    Rows(targetRow & ":" & lastRow).ClearContents

    Application.ScreenUpdating = True

    MsgBox "整理完成!现在 A 列是名称,B 列是网址。", vbInformation
End Sub

  1. Alt + F11插入 → 模块 → 粘贴上面代码。
  2. 关闭 VBA 编辑器。
  3. 回到 Excel → Alt + F8 → 选择 ConvertNameUrlInline运行

运行后:

  • 原本的 A 列单数行(名称)+ 双数行(网址)会被整理成:
    A列:名称
    B列:网址
    
  • 多余的旧行会被自动清空。

终极版

原位合并宏升级成一个先清空白行 → 再两列配对 → 删除多余数据的一键版。

加上奇偶行检测,防止最后一行没有配对而被丢掉。

这样如果数据行数是奇数,宏会弹出提示,先补齐网址再运行。


Sub CleanAndConvertNameUrlInlineSafe()
    Dim lastRow As Long, targetRow As Long, i As Long

    Application.ScreenUpdating = False

    ' ==== 1. 清空白行(以A列为基准) ====
    On Error Resume Next
    Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row) _
        .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    On Error GoTo 0

    ' ==== 2. 获取清理后的最后一行 ====
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    ' ==== 3. 奇偶行检测 ====
    If lastRow Mod 2 <> 0 Then
        Application.ScreenUpdating = True
        MsgBox "⚠ 数据行数是奇数,可能有名称缺少网址,请检查!" & vbCrLf & _
               "当前总行数: " & lastRow, vbExclamation, "数据不完整"
        Exit Sub
    End If

    ' ==== 4. 合并成两列(原位) ====
    targetRow = 1
    For i = 1 To lastRow Step 2
        Cells(targetRow, 1).Value = Cells(i, 1).Value
        Cells(targetRow, 2).Value = Cells(i + 1, 1).Value
        targetRow = targetRow + 1
    Next i

    ' ==== 5. 删除剩余多余行 ====
    If targetRow <= lastRow Then
        Rows(targetRow & ":" & lastRow).ClearContents
    End If

    Application.ScreenUpdating = True
    MsgBox "✅ 空白行已清理,并完成两列配对!", vbInformation
End Sub

  1. 自动清理空白行(不用提前手动处理)
  2. 检测数据行数是否为偶数
    • 如果是奇数 → 提示你补齐网址
    • 防止漏掉最后一个名称
  3. 原位合并 → A 列是名称,B 列是网址

运行它的流程和之前一样:

Alt + F11 → 插入模块 → 粘贴代码 → Alt + F8 → 运行 CleanAndConvertNameUrlInlineSafe

💡
欢迎分享文章,或是与我联系