Skip to content

单双数网址数据表格整理

youxiaohanpian
Published date:

想要实现的效果

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

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


公式法(不写 VBA,直接搞定)

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

C1 输入:

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

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

D1 输入:

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

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

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

得到:

C1   D1
C2   D2

这种两列结构。

最后:


原理

标准的 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 列改成两列配对好的表格,省去手动拖公式的步骤。


VBA 代码

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
        ' 单数行放到 C 列
        Cells(targetRow, 3).Value = Cells(i, 1).Value
        ' 双数行放到 D 列
        Cells(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运行 。 运行后:

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
        ' 名称放到 A 列
        Cells(targetRow, 1).Value = Cells(i, 1).Value
        ' 网址放到 B 列
        Cells(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列:名称
B列:网址

终极版

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

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

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


VBA 宏:空白行清理 + 奇偶检测 + 原位配对

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

Previous
我的 ComfyUI 工作流分享(更新中)
Next
【心理情绪】人为什么会吵架·人人都有病·冲突背后的创伤等读书笔记