对齐行以匹配列

时间:2017-06-29 15:34:39

标签: database excel vba excel-vba

问题

如何在不同的列中水平对齐值,并应用动态公式?先发制人,谢谢您的任何帮助或线索!下面粘贴的代码可以工作,只要它到达最终目的地的一半。但是如何实现最后两个目标?

1)对每个范围求和

2)水平对齐范围

包含客户ID,项目和价格的样本表。从左边的星期一,右边的星期二开始销售。

Before align and sum

当前结果 Semi aligned, no sum

期望的结果

将行A和E上的cust id与关联的和对齐。 注意每条黄线如何包含用于标识的cust id以及相关的Sum total。 Align and sum

现有VBA代码

Sub AlignAndMatch()
    'backup sheet
    ActiveSheet.Copy after:=Sheets(Sheets.Count)

    'Insert rows where current cell <> cell above
    Dim i, totalrows As Integer
    Dim strRange As String
    Dim strRange2 As String

    '----------------------------------------
    'Monday sort table
    Range("A2:C65536").Select
    Selection.Sort Key1:=Range("A2:C65536"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

    'Monday insert loop
    totalrows = ActiveSheet.Range("A65536").End(xlUp).Offset(1, 0).Row
    i = 0

    Do While i <= totalrows
       i = i + 1
       strRange = "A" & i
       strRange2 = "A" & i + 1
       If Range(strRange).Text <> Range(strRange2).Text Then
           Range(Cells(i + 1, 1), Cells(i + 2, 3)).Insert xlDown 'think cells ~A1:C2 insert
           totalrows = ActiveSheet.Range("A65536").End(xlUp).Offset(1, 0).Row
           i = i + 2 'for insert 2 rows
       End If
    Loop

    'Monday footer row loop
    totalrows = ActiveSheet.Range("A65536").End(xlUp).Offset(0, 0).Row
    i = 0

    Do While i <= totalrows
       i = i + 1
       If IsEmpty(Range("A" & i).Value) And Not IsEmpty(Range("A" & i + 1).Value) Then
           Range("A" & i).Value = Range("A" & i + 1).Value
           Range("B" & i).Value = "Sum"
       End If
    Loop

    '----------------------------------------
    'Tuesday sort table
    Range("E2:G65536").Select
    Selection.Sort Key1:=Range("E2:G65536"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal

    'Tuesday insert loop
    totalrows = ActiveSheet.Range("E65536").End(xlUp).Offset(0, 0).Row
    i = 0

    Do While i <= totalrows
       i = i + 1
       strRange = "E" & i
       strRange2 = "E" & i + 1
       If Range(strRange).Text <> Range(strRange2).Text Then
           Range(Cells(i + 1, 5), Cells(i + 2, 7)).Insert xlDown 'think cells ~A1:C2 insert
           totalrows = ActiveSheet.Range("A65536").End(xlUp).Offset(1, 0).Row
           i = i + 2 'for insert 2 rows
       End If
    Loop

    'Tuesday footer row loop
    totalrows = ActiveSheet.Range("E65536").End(xlUp).Offset(0, 0).Row
    i = 0

    Do While i <= totalrows
       i = i + 1
       If IsEmpty(Range("E" & i).Value) And Not IsEmpty(Range("E" & i + 1).Value) Then
           Range("E" & i).Value = Range("E" & i + 1).Value
           Range("F" & i).Value = "Sum"
       End If
    Loop
End Sub

2 个答案:

答案 0 :(得分:1)

如果我需要这样的东西,我可能会想到我想要的东西以及为什么:如果原来的日子不是来自某些人,那么你可以将所有东西放在一个列表中并制作一些支点......

但是。这里有一些想法,再次使用阵列,可能还有工作要做,但这有帮助:

<img src="{{ Storage::url($surgery->image) }}" alt="">

答案 1 :(得分:0)

我相信解决方案是通过VBA模拟SQL全外连接。我会开始抨击它。应该是一个有趣的个人挑战。一旦找到最终解决方案,我会尝试更新此答案。

我跟随的方向是here