Копирайте данни от Excel в Notepad

Копирам данни от Excel в Notepad с помощта на функцията SendKeys Excel VBA.

Гледам да избягвам използването на 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 в Notepad, но след извършване на някои корекции във файла на Excel, искам данните в Notepad да бъдат копирани в Excel, започвайки от C2.


person Community    schedule 14.02.2017    source източник
comment
Има ли конкретна причина да използвате бележника - текстовият файл ще се използва ли някъде другаде? Ако просто търсите някъде, където да съхранявате някои данни, докато правите нещо друго, тогава може би е по-добре да ги поставите в масив.   -  person Mark.R    schedule 14.02.2017
comment
опитвате ли се да копирате стойностите без формулите? Не се сещам за основателна причина да поставям и копирам от Notepad.   -  person Slai    schedule 14.02.2017
comment
@Slai Да, просто копирам стойностите и ги поставям отново в листа на Excel.   -  person    schedule 15.02.2017
comment
след това просто използвайте .PasteSpecial xlPasteValues, за да поставите само стойностите без формулите stackoverflow.com/questions/23937262/   -  person Slai    schedule 15.02.2017
comment
@Slai Основната причина, поради която трябва да копирам стойностите в бележника, е, че тъй като колоната съдържа Date и трябва да я конвертирам в текст. Ако директно преобразувам колоната в текст и поставя обратно стойностите, съдържанието на клетката и стойността, които се показват в лентата за формули, са различни. Пример е 2017/01/01 в клетката и 01-Jan-2017 в лентата с формули. Бих искал да е същото. Благодаря.   -  person    schedule 16.02.2017
comment
Ето един бърз метод, използващ VBA: stackoverflow.com/questions/24910288/   -  person JoshInDC    schedule 28.03.2019


Отговори (5)


Това е алтернативен процес на 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
person Robin Mackenzie    schedule 14.02.2017
comment
Благодаря ви за вашето решение. Беше много полезно. Когато е възможно, бих искал да обясните реда "New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}". Трябва да знам, че ако нещо друго ще бъде изхвърлено във временната памет всеки път, когато кодът се изпълнява, и ако това е така, тази памет ще бъде ли изпразнена, когато бележникът се затвори? - person Luiz Vaughan; 23.10.2018
comment
Горното работи на Win10 Pro Insider Preview 19559. - person charlyRoot; 12.02.2020

Можете да използвате обекта на файловата система, за да пишете в текстов файл:

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/en-us/library/ee198716.aspx

person Pᴇʜ    schedule 14.02.2017

Малко късно, но можете да копирате данните в клипборда и да ги поставите като текст (тествано и работи):

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"
person Slai    schedule 16.02.2017

Ето вероятно нещо, което ще работи доста добре:

  1. Копирайте това в друг лист: wb.Sheets(2).Range("C2:C" & lRow).Copy
  2. Запазете този лист като *.csv файл: Запазване на excel работен лист към CSV файлове с име на файл+име на работен лист с помощта на VB
  3. Тогава файлът *.csv е файл на Notepad. :)
person Vityata    schedule 14.02.2017

Опитайте тази:

Sub SimpleVBAWriteToFileWithoutQuotes()

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

End Sub
person JoshInDC    schedule 28.03.2019