AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1743895
Accepted
BmyGuest
BmyGuest
Asked: 2022-09-24 00:16:49 +0800 CST2022-09-24 00:16:49 +0800 CST 2022-09-24 00:16:49 +0800 CST

如何最好地将混合行/列格式的数据重新排序到一个简单的表格中?

  • 772

我有(来自 CVS 文件)以下格式的数据:

数据是一个连续列表(逐行逗号分隔值),其中在任意位置插入或删除列。在这些情况下,会添加一个新的“标题”行。第一列始终是日期。直接导入将如下所示:

数据源表格式

现在我需要进一步的数据评估是一个如下表: 通缉数据表格式

由于我有大量这种格式的数据,因此手动重新排列不是一种选择。

我怎样才能自动实现这种手段?

是通过从 CVS 文件查询导入到 Excel,还是通过后续的 Excel 操作?

microsoft-excel worksheet-function
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    JohnSUN
    2022-09-24T04:06:28+08:002022-09-24T04:06:28+08:00

    从计算机和关系数据库理论的角度来看,将混合数据转换为这种形式要好得多:

    新表的形式

    通过以下脚本可以很快完成这项工作:

    Option Explicit
    
    Sub repackMixedData()
    Dim sheet As Worksheet
    Dim rSource As Range
    Dim rRow As Range
    Dim rHeader As Range
    Dim oCellDate As Range
    Dim oCell As Range
    Dim oTargetCell As Range
        Set sheet = ActiveSheet
        Set rSource = sheet.UsedRange
        Set sheet = ThisWorkbook.Worksheets.Add()
        Set oTargetCell = sheet.Range("A1")
        With oTargetCell.Resize(1, 3)
            .Value = Array("Date", "Item", "Value")
            .Font.Bold = True
        End With
        For Each rRow In rSource.Rows
            Set oCellDate = rRow.Cells(1)
            If oCellDate = "Date" Then
                Set rHeader = rRow
            Else
                For Each oCell In rRow.Offset(0, 1).Cells
                    If Not IsEmpty(oCell) Then
                        Set oTargetCell = oTargetCell.Offset(1, 0)
                        oTargetCell.Value2 = oCellDate.Value2
                        oTargetCell.NumberFormat = oCellDate.NumberFormat
                        oTargetCell.Offset(0, 1) = rHeader.Cells(1, oCell.Column).Text
                        oTargetCell.Offset(0, 2) = oCell.Value
                    End If
                Next oCell
            End If
        Next rRow
    End Sub
    

    使用生成的“平面”表,您可以做任何事情,例如,创建一个数据透视表并获得类似于您的第二个屏幕截图的结果。

    更新由于事实证明实际数据比预期的要多得多,因此对宏进行了略微改进。请尝试此选项 - 它应该会更快一些。

    Sub repackMixedData2()
    Dim sheet As Worksheet
    Dim rSource As Range
    Dim rRow As Range
    Dim rHeader As Range
    Dim oCellDate As Range
    Dim oCell As Range
    Dim countOfValues As Long
    Dim arrResult As Variant
    Dim index As Long
        Set sheet = ActiveSheet
        Set rSource = sheet.UsedRange
        countOfValues = Application.WorksheetFunction.CountA(rSource.Offset(0, 1))
    ReDim arrResult(1 To countOfValues, 1 To 3) As Variant
        index = 1
        arrResult(index, 1) = "Date"
        arrResult(index, 2) = "Item"
        arrResult(index, 3) = "Value"
        For Each rRow In rSource.Rows
            Set oCellDate = rRow.Cells(1)
            If oCellDate = "Date" Then
                Set rHeader = rRow
            Else
                For Each oCell In rRow.Offset(0, 1).Cells
                    If IsEmpty(oCell) Then Exit For
                    index = index + 1
                    arrResult(index, 1) = oCellDate.Value2
                    arrResult(index, 2) = rHeader.Cells(1, oCell.Column).Text
                    arrResult(index, 3) = oCell.Value
                Next oCell
            End If
        Next rRow
        
        Set sheet = ThisWorkbook.Worksheets.Add()
        sheet.Range("A1:C" & index).Value2 = arrResult
        sheet.Range("A1:C1").Font.Bold = True
        sheet.Range("A:A").NumberFormat = oCellDate.NumberFormat
    End Sub
    
    • 1

相关问题

  • 如何对整列使用 Excel 的 LENGTH 函数?

  • Excel 数组(2 个变量)

  • 如何从 WSL 打开 office 文件

  • VBA根据文件名重命名工作表

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve