Excel 需要将电子表格数据粘贴到我的vba表单单元格中的方法吗?

Excel 需要将电子表格数据粘贴到我的vba表单单元格中的方法吗?,excel,vba,paste,Excel,Vba,Paste,需要将电子表格数据粘贴到我的vba表单单元格中的方法吗 我有一个csv电子表格,每天下载新数据更新。 我想复制此csv文件中的所有列,并将其粘贴到另一个工作簿中相应文本框中的vba表单中 例如 假设CSV文件有4列, 数据、ID、名字、姓氏 我只需要复制整行和4列,并将其粘贴到我的vba表单中的4个正确的文本框中 我不想复制和粘贴每个人,因为我有超过4列,我需要一个更快的方式,所以只有一个粘贴将粘贴到正确的文本框。这能做到吗 请帮忙 谢谢 “现在只需将您的内容粘贴到第一个单元格中受德克解决方案的

需要将电子表格数据粘贴到我的vba表单单元格中的方法吗

我有一个csv电子表格,每天下载新数据更新。 我想复制此csv文件中的所有列,并将其粘贴到另一个工作簿中相应文本框中的vba表单中

例如

假设CSV文件有4列, 数据、ID、名字、姓氏

我只需要复制整行和4列,并将其粘贴到我的vba表单中的4个正确的文本框中

我不想复制和粘贴每个人,因为我有超过4列,我需要一个更快的方式,所以只有一个粘贴将粘贴到正确的文本框。这能做到吗

请帮忙

谢谢


“现在只需将您的内容粘贴到第一个单元格中

受德克解决方案的启发,我为表单添加了一些功能,使表单具有动态性。这只是为了展示这个概念,它确实与原始问题相关,特别是处理来自输入的动态列范围。它的不同之处在于,数组考虑了输入列的动态范围,然后根据数组中的项目数量创建文本框

它的作用:

Sub Text1_Change()
Dim csvArray() As String
Dim lCount As Long, maxCols As Long
Dim tempHeight As String

    csvArray = Split(Text1.Value, vbTab)
    maxCols = UBound(csvArray) + 1
    Text1.Value = csvArray(0)

    tempHeight = 55 + (15.5 * maxCols)    'Set new height for 15.5 pixels per TextBox
    Me.Height = tempHeight
    For lCount = 2 To maxCols             'Not using 1 for Loop because Text1 was already set.

        'Create a new TextBox and assign its size, name, and value.
        Set ctlTXT = Controls.Add("Forms.TextBox.1", "Text" & lCount)   
        ctlTXT.name = "Text" & lCount
        ctlTXT.Left = 15
        ctlTXT.Height = 15: ctlTXT.Width = 100
        ctlTXT.Top = (lCount - 1) * 17 + 2
        ctlTXT.Value = csvArray(lCount - 1)      'Set the value of the new TextBox

    Next lCount
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    Call ResetBoxes

End Sub
  • 命令按钮使用范围的lastCol变量复制行(例如:“A”)。您可以绕过此操作,因为UserForm将粘贴剪贴板,而不考虑其来源,前提是您已经复制了行
  • 打开带有1个文本框的用户表单
  • 剪贴板内容将自动粘贴到Text1中
  • 创建一个数组,将Text1的值按TAB拆分
  • 用户表单的大小被重新调整以适合每个文本框
  • 对于数组中的每个项目(不包括要分配给Text1的索引(0)),将创建一个新的文本框并分配数组值
  • 关闭UserForm后,除Text1外,名称以“Text”开头的每个文本框都将被删除,从而为下次使用重置表单
注意事项:

  • 使用此命名方法,文本框将命名为“Text1”-“Text(n)”
  • 我没有包括文本框的标签
  • 如果有大量列/文本框,请在UserForm上设置属性。
    '滚动条=2 fmScrollBarsVertical'
可选:事件从第1行复制数据并启动放置在模块中的用户表单

Sub DynamicTextFormLaunch()
Dim lastCol As Long

    lastCol = ActiveSheet.Cells(1, Columns.count).End(xlToLeft).column

    With ActiveSheet
        .Range("A1", (.Cells(1, lastCol))).Copy
        UserFormName.Show      'Set your UserForm name here
    End With
End Sub
用户表单代码:下面的所有内容都在用户表单代码中

Sub UserForm_Activate()

    Text1.Paste

End Sub
文本更改事件:

Sub Text1_Change()
Dim csvArray() As String
Dim lCount As Long, maxCols As Long
Dim tempHeight As String

    csvArray = Split(Text1.Value, vbTab)
    maxCols = UBound(csvArray) + 1
    Text1.Value = csvArray(0)

    tempHeight = 55 + (15.5 * maxCols)    'Set new height for 15.5 pixels per TextBox
    Me.Height = tempHeight
    For lCount = 2 To maxCols             'Not using 1 for Loop because Text1 was already set.

        'Create a new TextBox and assign its size, name, and value.
        Set ctlTXT = Controls.Add("Forms.TextBox.1", "Text" & lCount)   
        ctlTXT.name = "Text" & lCount
        ctlTXT.Left = 15
        ctlTXT.Height = 15: ctlTXT.Width = 100
        ctlTXT.Top = (lCount - 1) * 17 + 2
        ctlTXT.Value = csvArray(lCount - 1)      'Set the value of the new TextBox

    Next lCount
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    Call ResetBoxes

End Sub
关闭事件:

Sub Text1_Change()
Dim csvArray() As String
Dim lCount As Long, maxCols As Long
Dim tempHeight As String

    csvArray = Split(Text1.Value, vbTab)
    maxCols = UBound(csvArray) + 1
    Text1.Value = csvArray(0)

    tempHeight = 55 + (15.5 * maxCols)    'Set new height for 15.5 pixels per TextBox
    Me.Height = tempHeight
    For lCount = 2 To maxCols             'Not using 1 for Loop because Text1 was already set.

        'Create a new TextBox and assign its size, name, and value.
        Set ctlTXT = Controls.Add("Forms.TextBox.1", "Text" & lCount)   
        ctlTXT.name = "Text" & lCount
        ctlTXT.Left = 15
        ctlTXT.Height = 15: ctlTXT.Width = 100
        ctlTXT.Top = (lCount - 1) * 17 + 2
        ctlTXT.Value = csvArray(lCount - 1)      'Set the value of the new TextBox

    Next lCount
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    Call ResetBoxes

End Sub
删除已创建的文本框。

Private Sub ResetBoxes()

Dim ctrl As Control
Dim tempName As String
Dim tempNum As String

For Each ctrl In Me.Controls
    tempName = Left(ctrl.name, 4)
    tempNum = Right(ctrl.name, 1)

    'Checking to NOT delete Text1
    If tempName = "Text" And tempNum <> "1" Then
        Me.Controls.Remove (ctrl.name)
    End If
Next

    MsgBox ("Removed new TextBoxes, and reset UserForm to original controls.")

End Sub
专用子重置框()
按ctrl键作为控件
Dim tempName作为字符串
Dim tempNum作为字符串
对于Me.Controls中的每个ctrl键
tempName=Left(ctrl.name,4)
tempNum=Right(ctrl.name,1)
'正在检查以不删除文本1
如果tempName=“Text”和tempNum“1”,则
Me.Controls.Remove(ctrl.name)
如果结束
下一个
MsgBox(“删除新的文本框,并将UserForm重置为原始控件。”)
端接头


你能详细说明栏目数量的范围和条件吗?我希望你不介意我添加一些想法,而不是今晚玩游戏。这让我受到了启发。