在Excel中设置触发器将一个表格中的列转换为另一个表格中的新行

我的查询是如何设置一个触发器,如果​​一个新的列被input到SheetA中,我希望它转置并写入SheetB中的下一个可用行。 我做了一个macros录制,VBA脚本如下:

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

请告诉我如何处理这个问题,因为我对VBA非常陌生,并且没有设置这样的触发器。

在此先感谢您的帮助。

PowerQuery目前无法使用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 

然后,您可以使用“打开”事件启动刷新和移调macros,并且/或者您可以使用指定的快捷键手动将其踢出,而不是刷新

*我不会推荐ctrl + p给出这是打印热键

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

编辑我已经添加了Worksheet_Change实际触发“审讯”macros。 该macros如果为false,则会调用转置macros。 注意!Sheet1上放置Worksheet_Changemacros,并在需要的位置放置Transpose Macro 。 最后复制单元格行的search是基本的(但现在已经足够了)。 仍然为了转置单元格,你应该真的使用倒置Cells(i,j).CopyCells(j,i).Paste 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的刷新之后进行转置就简单多了。 欢迎任何反馈。

我猜工作表变化事件应该有所帮助。