【问题标题】:Excel: Macro needed - 2 columns of data to become 1 column "every other"Excel:需要宏 - 2 列数据变为 1 列“每隔一个”
【发布时间】:2013-07-08 18:50:25
【问题描述】:

您好,首先让我说声谢谢!

我使用 Excel 来捕获用户需求和描述。然后我把这些信息清理干净并粘贴到演示文档中,应用格式,粘贴到 Powerpoint 等。总共可以完成 100 行。我正在寻找的是一个宏,一旦将其粘贴到 Excel 中,我就可以将其应用于数据。数据将是文本,非数字

我有一个宏,我用它来插入一个空白行作为每隔一行。然后我手动执行其他所有操作(如下所示的宏)。

我正在寻找的是一个插入空白行的宏,然后将第 2 列向下偏移 1 行。然后将第 1 列粘贴到第 2 列(不将空白单元格复制到第 2 列中我已经存在的数据上)。

我已将链接粘贴到我正在寻找的图片上。我还尝试在下面显示(数字是第 1 列,字母是第 2 列)。

2 columns to 1 column - desired result

1 A
2 B
3 C

我想要的结果:

1
一个
2

3
C

我当前的“空白行”宏:

Sub insertrow()
' insertrow Macro

Application.ScreenUpdating = True
Dim count As Integer
Dim X As Integer

For count = 1 To 300
If ActiveCell.Value <> "" Then
ActiveCell.Offset(1, 0).Select
Range(ActiveCell, ActiveCell.Offset(0, 0)).EntireRow.Insert
ActiveCell.Offset(1, 0).Select
For X = 1 To 1
Next X
Else
ActiveCell.Offset(1, 0).Range("a1").Select
End If
Next count

End Sub

【问题讨论】:

    标签: excel excel-2010 multiple-columns vba


    【解决方案1】:

    这应该可行,但您必须根据您的确切布局和需求进行一些调整。

    Sub mergeColumns()
        Dim mergedData As Variant
        ReDim mergedData(1 To 600)
        dataToProcess = Range("A2:B301")
        For i = 1 To 300
            mergedData(i * 2 - 1) = dataToProcess(i, 1)
            mergedData(i * 2) = dataToProcess(i, 2)
        Next i
        Range("B2:B601") = WorksheetFunction.Transpose(mergedData)
    End Sub
    

    【讨论】:

    • 啊!就是这个!正是我想要的。谢谢你!我希望其他人能发现这一点——从数据友好到视觉吸引力的改变真的是巨大的。非常感谢!
    • 我刚找到这个,根据我的需要对其进行了修改(每个最左边的列下需要多列,因此需要插入多行而不是一行)。节省了大量的时间和精力。谢谢。
    【解决方案2】:

    以下内容无需插入空白行即可满足您的需求。它还会计算工作表上的最后一行(有 2 列),这样您就无需在循环结束时进行硬编码。

    cmets 应该可以帮助您了解每一步发生的情况。然后,您可以修改它以使用您的特定工作簿。有很多方法可以解决这个问题。我选择将旋转后的结果放在第二张纸上。

    Sub PivotTwoColumnsIntoOne()
        Dim wb As Workbook
        Dim src As Worksheet
        Dim tgt As Worksheet
        Dim rng As Range
        Dim cell As Range
        Dim lastRow As Long
        Dim targetRow As Long
    
        Set wb = ThisWorkbook
        ' set our source worksheet
        Set src = wb.Sheets("Sheet1")
        ' set our target sheet (where the single column will be)
        Set tgt = wb.Sheets("Sheet2")
        ' get the last row on our target sheet
        lastRow = src.Range("A" & src.Rows.Count).End(xlUp).Row
        ' set the starting point for our target sheet
        targetRow = 1
    
        Set rng = src.Range("A1:A" & lastRow)
    
        For Each cell In rng
            With tgt.Range("A" & targetRow)
                ' get the value from the first column
                .Value = cell.Value
                ' get the value from the second column
                .Offset(1).Value = cell.Offset(, 1).Value
                .HorizontalAlignment = xlLeft
            End With
            targetRow = targetRow + 2
        Next cell
    End Sub
    

    【讨论】:

    • 餐饮主管 - 这也是一个很好的解决方案!!,我喜欢将结果放在第二张纸上的想法。最初它给了我一个错误,但这是一个简单的修复——工作簿 2 需要在运行宏之前提前存在。一旦我这样做了,它就很好用。提供的两种解决方案都完全符合我的要求。谢谢!!!
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多