在Excel中设置触发器以将一个工作表中的列转置为另一个工作表中的新行

时间:2013-12-10 11:54:04

标签: excel excel-vba transpose vba

我的查询是如何设置触发器,以便如果在SheetA中输入新列,我希望它转置并写入SheetB中的下一个可用行。我做了一个宏录制,下面给出了VBA脚本:

Sub Macro5()
'
' Macro5 Macro
'
' Keyboard Shortcut: Ctrl+p
'
    Range("A1:E1").Select
    Selection.FormulaArray = "=TRANSPOSE(Sheet1!RC:R[4]C)"
End Sub

请告知如何继续这项工作,因为我对VBA很陌生并没有接触这样的设置触发器。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

PowerQuery not currently accessable使用VBA,但是,可以使用Refresh.All来控制查询的刷新,而不是手动(或打开)刷新数据,然后期待触发要发生这种情况,你可以一步到位:

Sub Macro5()
'
' Macro5 Macro
'
' Keyboard Shortcut: Ctrl+p
'
  Refresh.All
Sheets("sheetB").Select
  Range("A1:E1").Select
    Selection.FormulaArray = "=TRANSPOSE(Sheet1!RC:R[4]C)"
End Sub

然后您可以使用On Open event启动刷新和转置宏和/或您可以使用您指定的快捷方式手动启动它*而不是点击刷新

*我不建议使用ctrl + p,因为这是打印热键

答案 1 :(得分:1)

这意味着您应该在Sheet(2)上拥有与Sheet(1)上的Columns一样多的行。因此,您的触发器应检查两者是否相等,如果不是,则运行转置宏。因此:

编辑我已添加Worksheet_Change以实际触发“询问”宏。如果为false,则此宏调用转置宏。 注意!Worksheet_Change宏放在Sheet1Transpose Macro的任意位置。搜索最后一个复制单元格的行是基本的(但现在就足够了)。 仍然要转置细胞,您应该使用倒置的Cells(i,j).CopyCells(j,i).Paste

Private Sub Worksheet_Change(ByVal Target As Range)
LastRow = Sheets(2).Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
LastColumns = Sheets(1).Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Row
Dim SearchRange As Range: Set SearchRange = ActiveSheet.Range("A1:AZ1") 'Check on the header row only
    If Not Intersect(Target, SearchRange) Is Nothing Then
        If LastRow <> LastColumn Then Call YourTransposeMacro
    End If
End Sub

Sub YourTransposeMacro()
LastRowToCopy = Application.WorksheetFunction.CountA(Sheets(1).Range("A1:A1000"))
'This method works only if you don't have blanks on your table (specially on column A)
LastColumn = Sheets(1).Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
    For i = 1 To LastRowToCopy
        Sheets(1).Cells(i, LastColumn).Copy
        Sheets(2).Cells(LastColumn, i).PasteSpecial xlPasteValues
    Next i
End Sub

上面的代码仅涵盖了新列也作为最后一列放置的情况(在表1中)。但是,正如我所看到的那样,在基于Worksheet_Change的刷新*之后复制所有数据并进行转置会更加简单。 欢迎任何反馈。

答案 2 :(得分:0)

我想worksheet change event应该会有所帮助。