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

在Excel中设置触发器以将一张工作表中的列转换为另一张工作表中的新行,excel,transpose,vba,Excel,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非常陌

我的问题是如何设置触发器,以便在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非常陌生,因此没有设置此类触发器的经验

提前感谢您的帮助。

我想应该会有帮助。

PowerQuery使用VBA,但是,可以使用
刷新来控制查询的刷新。因此,您不必手动(或打开时)刷新数据,然后期望触发发生,而只需一步即可完成:

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
然后,可以使用启动刷新和转置宏和/或使用指定的快捷方式*手动启动宏,而不是单击刷新


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

这意味着工作表(2)上的行数应与工作表(1)上的列数相同。因此,触发器应该检查两者是否相等,如果不相等,则运行转置宏。因此:

编辑我添加了
工作表\u更改
以实际触发“询问”宏。如果此宏为false,则调用转置宏注意
工作表\u Change
宏放在
Sheet1
上,并将
Transpose宏放在所需的任何位置。对最后一个拷贝单元格行的搜索是初步的(但现在就足够了)仍然要转换单元格,您应该真正使用倒置的
单元格(i,j)。复制
而不是
单元格(j,i)。粘贴

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
Private子工作表\u更改(ByVal目标作为范围)
LastRow=Sheets(2).Cells.Find(“*”,[A1],.xlByRows,xlPrevious).Row
LastColumns=Sheets(1).Cells.Find(“*”,[A1],.xlByColumns,xlPrevious).行
Dim SearchRange As Range:Set SearchRange=ActiveSheet.Range(“A1:AZ1”)“仅检查标题行
如果不相交(目标、搜索范围)则为空
如果LastRow LastColumn,则调用您的TransportSemacro
如果结束
端接头
Sub-Semacro()
LastRowToCopy=Application.WorksheetFunction.CountA(第(1)页).Range(“A1:A1000”))
'此方法仅在表上没有空格(特别是A列)时有效
LastColumn=Sheets(1).Cells.Find(“*”,[A1],.xlByColumns,xlPrevious).Column
对于i=1到最后一行复制
第(1)页。单元格(i,最后一列)。复制
表(2).单元格(最后一列,i).粘贴特殊值
接下来我
端接头
上述代码仅涵盖新列也作为最后一列(在第1页中)放置的场景。但是,正如我所看到的,复制所有数据并在刷新之后转置(基于工作表的更新)会简单得多。
欢迎任何反馈。

请澄清-当您说输入了新列时,您是指有人右键单击并插入列,还是指有人向列中添加数据?你能展示一些开始的输入和预期的输出吗?请帮助说明你想要实现什么?嗨,Steph,是的,通过新的列条目我建议我在excel中使用Power QUery插件,每当MySQL数据库中有新的添加时,它都会更新。所以这更像是我按下刷新,新条目进入SheetA。当这种情况发生时,我想要一个触发器来执行select并转置到SheetB。我希望这能让事情变得更清楚一点。我将尝试发布图像…并且需要一个包含在工作表代码中的更改事件语句作为触发机制Hello Takedasama,谢谢您的输入。他们是正确方向的真正指针。我在问题中提供了转置宏。我能把它插入你的答案吗?对不起,如果我听起来像个傻瓜,但问题是我知道宏,但以前从未使用过VBA。现在就试试吧。我已经更新了答案。至于你的问题:转置宏应该调整到你刚刚添加的列,不能硬编码,所以你必须查找最后一列。如果添加了一个新列,但不是最后一个列,那么检查会有点棘手。上面的代码仅包括最后一列。@Stephlock+1我已修改了要使用
工作表\u Change
触发的代码。您好,Steph,感谢您提供了有关Excel中PowerQuery缺少VBA支持的指针。但是你提出的解决方案对我来说也很好。Ctrl+如果它刷新数据并将数据从查询表转换到报表表。听起来很完美。我可以刷新一下吗?好的,然后使用Takedasama上面的答案,然后在检查后使用转置宏?到目前为止,你的帮助非常有用。我会按照你的建议更换钥匙。你好,Yuvraj,谢谢你的回复。Steph建议我们在Takedasama的回复中使用这个变化事件吗?是的,这就是解决问题的方法。但单凭这一点是行不通的。我在触发器宏上添加了
工作表\u Change