2013-11-29 3 views
0

Я в основном застрял. У меня есть код, который позволяет мне просматривать файл, как только файл выбран, он копирует все данные в этом файле, а затем позволяет мне выбирать рабочий лист из любой открытой книги в то время. Как только рабочий лист выбран [это то, где я застреваю], я хочу, чтобы он вставлял его в j7. вместо этого он не делает этого, имея в виду, что я буду менять имя файла каждый день, так как он имеет дату текущего дня на нем. вот мой код:Скопируйте данные пасты с другой книги на текущий рабочий лист

Sub Macro4() 
' 
' Macro4 Macro 
' 

' 
Range("A1").Select 
Dim fileStr As String 

fileStr = Application.GetOpenFilename() 

If fileStr = "False" Then Exit Sub 

Workbooks.Open fileStr 

Range("A2").Select 
Range(Selection, Selection.End(xlToRight)).Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 
Window.Sheets(Array("Forecast_workings")).Select{**this is where i want to be able to select a worksheet from any open workbook and it will paste the data in cell J7 of that worksheet.** 
Range("J7").Select 
Application.CutCopyMode = False 
Range("C16:C27").Select 
Selection.Copy 
Range("E16").Select 
ActiveSheet.Paste 
Application.CutCopyMode = False 
Range("G16:G27").Select 
Selection.Copy 
Range("C16").Select 
ActiveSheet.Paste 
Application.CutCopyMode = False 
Range("O16").Select 
End Sub 

ответ

2

Я вижу много ошибок в коде.

Прежде всего. Вы избегаете использования .Select. INTERESTING READ

Если я вас правильно понял, то, чтобы получить имя листа, который пользователь выбирает в выполнения, вы можете использовать Application.InputBox с Type:=8. Это вернет диапазон, и из него вы можете использовать .Parent.Name, чтобы получить имя рабочего листа.

Это то, что вы пытаетесь?

Ваш код может быть записан в виде (UNTESTED)

Sub Macro4() 
    Dim fileStr As String 
    Dim wb As Workbook, thiswb As Workbook 
    Dim ws As Worksheet, thisws As Worksheet 
    Dim Lcol As Long, LRow As Long 
    Dim Ret As Range 

    '~~> Set an object for thisworkbook and worksheet 
    Set thiswb = ThisWorkbook 
    '~~> Change this to the sheet from where you want to copy 
    Set thisws = thiswb.Sheets("Sheet1") 

    '~~> Let user choose a file 
    fileStr = Application.GetOpenFilename() 

    If fileStr = "False" Then Exit Sub 

    '~~> Set an object for workbook opened and it's worksheet 
    Set wb = Workbooks.Open(fileStr) 

    On Error Resume Next 
    Set Ret = Application.InputBox("Select a cell from the sheet you want to choose", Type:=8) 
    On Error GoTo 0 

    If Ret Is Nothing Then Exit Sub 

    Set ws = wb.Sheets(Ret.Parent.Name) 

    With thisws 
     '~~> Find Last column in row 2 
     Lcol = .Cells(2, .Columns.Count).End(xlToLeft).Column 
     '~~> Find last cell in Col 1 
     LRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     '~~> Copy your range directly to new worksheet selected 
     .Range(.Cells(2, 1), .Cells(LRow, Lcol)).Copy ws.Range("J7") 
     .Range("C16:C27").Copy ws.Range("E16") 
     .Range("G16:G27").Copy ws.Range("C16") 
     Application.CutCopyMode = False 
    End With 
End Sub 
+2

@ Шива: Это второй раз, когда вы опустили меня, не оставляя никаких объяснений. Вы находитесь на пути мести. У меня нет выбора, кроме как сообщить вам модератора. Я сделал снимок вашего профиля. –

+2

@ Шива: [Siva] (http://stackoverflow.com/users/325521/shiva) Я вижу, что вы удалили нижний план, и ваш счет поднялся на 1. Это только показывает, что это вы. Прекратите делать это, или я сообщу модератору. ПОСЛЕДНЕЕ ПРЕДУПРЕЖДЕНИЕ. –

0

при работе с несколькими тетрадями, не использует диапазон(), но wb.range(), где термометру определяются с помощью функции набора. Кроме того, актуэт может быть сложным. Предпочтительно назовите лист, на котором вы используете листы («что угодно»). И наконец, копировать вещи не использовать Activate/выбрать, просто сделать, как это:

wb.sheets("whatever").range() thisworkbook.sheets("watever2").range(""). 

Я также видел, как вы не используете application.enableevents = ложь/правда, так события будут вызывать как сумасшедший и ваш ActiveSheet (или ячейка) изменится как сумасшедший, если у вас есть код в разделе workheet_change.

Смежные вопросы