从Excel复制数据到记事本

3

我使用 SendKeys Excel VBA 函数将数据从 Excel 复制到记事本。

我希望避免使用 SendKeys。

以下是我的代码:

sub test()

    dim wb as Workbook
    set wb = "C:\Documents\test.xlsx"
    wb.Sheets(2).Range("C2:C" & lRow).Copy
    myApp = Shell("Notepad.exe", vbNormalFocus)
    SendKeys "^v"
    Application.CutCopyMode = False
    wb.Sheets(2).Range("C2:C" & lRow).NumberFormat = "@"
 end sub

这只是将数据从Excel复制到记事本,但在Excel文件中进行了一些更改后,我希望从C2开始将记事本中的数据复制到Excel。


2
你使用记事本的特定原因是什么 - 这个文本文件会在其他地方使用吗?如果你只是想在做其他事情的时候“存储”一些数据,那么最好将它放入一个数组中。 - Mark.R
你是想复制数值而不是公式吗?我想不出从记事本中粘贴和复制的任何好理由。 - Slai
@Slai 是的,我只是将值复制并重新粘贴到Excel表格中。 - user6632933
然后只需使用“.PasteSpecial xlPasteValues”粘贴仅包含值而没有公式。https://dev59.com/NWAg5IYBdhLWcg3wI4ER - Slai
@Slai 我必须将值复制到记事本的主要原因是该列包含“日期”,我必须将其转换为文本。如果我直接将列转换为文本并粘贴回值,则单元格内容和值在公式栏中显示不同。例如,单元格中为“2017/01/01”,而公式栏中为“01-Jan-2017”。我希望它们相同。谢谢。 - user6632933
这里有一个使用VBA的快速方法:https://dev59.com/zWAf5IYBdhLWcg3wMwXX#55399893 - JoshInDC
6个回答

9

这是一种替代 SendKeys 的过程:

  • 从工作表上的单元格范围获取值

  • 复制到剪贴板

  • 将剪贴板的内容读入字符串

  • 将该字符串保存到临时文件中

  • 使用临时文件的内容打开 Notepad.exe

代码:

Option Explicit

Sub OpenNotepadWithTempFileWithClipboardContent()

    Dim rngData As Range
    Dim strData As String
    Dim strTempFile As String

    ' copy some range values
    Set rngData = Sheet3.Range("B1:B5")
    rngData.Copy

    ' get the clipboard data
    ' magic code for is for early binding to MSForms.DataObject
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipBoard
        strData = .GetText
    End With

    ' write to temp file
    strTempFile = "D:\temp.txt"
    With CreateObject("Scripting.FileSystemObject")
        ' true to overwrite existing temp file
        .CreateTextFile(strTempFile, True).Write strData
    End With

    ' open notepad with tempfile
    Shell "cmd /c ""notepad.exe """ & strTempFile & """", vbHide

End Sub

谢谢你的解决方案。它非常有帮助。如果可能的话,我想请你解释一下 "New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}" 这一行。我需要知道,每次代码执行时是否会有其他东西被倾倒到临时内存中,如果是这样,那么当记事本关闭时,这个内存会被清空吗? - Luiz Vaughan
以上适用于Win10 Pro Insider Preview 19559。 - charlyRoot

3
你可以使用文件系统对象将内容写入文本文件中:
Dim fso as Object
Set fso = CreateObject("Scripting.FileSystemObject")

Dim oFile as Object
Set oFile = FSO.CreateTextFile(strPath)

oFile.WriteLine "test" 

oFile.Close
Set fso = Nothing
Set oFile = Nothing   

更多信息请参见此处:https://technet.microsoft.com/zh-cn/library/ee198716.aspx


1

有点晚了,但是您可以将数据复制到剪贴板,然后将其作为文本粘贴(已测试并可行):

Dim r As Range
Set r = wb.Sheets(2).Range("C2:C" & lRow)
r.Copy

With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .GetFromClipboard
    Application.CutCopyMode = False
    .PutInClipboard
End With

r.Select
r.NumberFormat = "@"
r.Worksheet.PasteSpecial "Text"

0

0
    'This macros may solve your problem
    Sub SaveMySheetAsTextFile()
        Sheets("Sheet1").Select
        ActiveWorkbook.SaveAs Filename:="C:\mynotepadfile.txt", FileFormat:=xlText
    End Sub

0

试试这个:

Sub SimpleVBAWriteToFileWithoutQuotes()

        Open "c:\TEMP\Excel\out.txt" For Output As #1
        Print #1, Application.ActiveSheet.Cells(2, 3)
        Close #1

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接