我的查询是如何设置触发器,以便如果在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很陌生并没有接触这样的设置触发器。
提前感谢您的帮助。
答案 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
宏放在Sheet1
和Transpose Macro
的任意位置。搜索最后一个复制单元格的行是基本的(但现在就足够了)。 仍然要转置细胞,您应该使用倒置的Cells(i,j).Copy
比Cells(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应该会有所帮助。