2013-10-07 5 views
0

Я провел почти весь день сегодня (по крайней мере, 8 часов), пытаясь найти ответ на мою дилемму, но я нахожусь в своем уме. Вот сценарий и выпуск:excel macro, чтобы условно скопировать определенные ячейки из другой книги

Сценарий: У нас есть одна рабочая тетрадь (Equipment Log.xlsx). В этой книге 6 листов (Sheet1, Sheet2, .....). Каждый лист имеет разные «заголовки» в строке 1, но все листы имеют несколько заголовков и одинаковые столбцы (ID, Facility, Building, Division, Department и Room), а также позиция, в которой каждая позиция отличается в каждой книге (В связи).

Проблема: Мне нужно иметь отдельную книгу Excel (или как LAST resort, добавить 7-й лист в журнал оборудования), который либо после открытия, либо после того, как пользователь нажимает на определенную ячейку, файл журнала исходного оборудования, посмотрите дату «Due» для каждого оборудования, и если он попадает в течение 30 дней с «Today()», копирует «ID», «Facility», «Building», «Отдел», «Отдел», «Комната» и «Должно») определенным ячейкам в активный рабочий лист.

У меня есть некоторый опыт работы с макросами, но он ОЧЕНЬ ограничен. Я взял JAVA-101 в колледже, но я никогда не продолжал больше этого.

Я ОЧЕНЬ непредвзято с этим проектом.

Спасибо, что нашли время прочитать и СПАСИБО +++ за то, что нашли время ответить.

ответ

1

Я немного скучно, поэтому я решил расшевелить что-то, чтобы помочь вам:

Этот код будет выглядеть в оборудование Log книги и проходным каждого листа, оценки должной даты против сегодняшнего date ... Затем он скопирует информацию из указанных вами ячеек в следующую строку любой рабочей книги, из которой вы запускаете этот код. Вам, вероятно, придется внести некоторые коррективы, но это должно быть хорошим началом.

Sub equipLog() 

Dim eqWb As Workbook 
Dim sh1 As Worksheet 
Dim due, ID, fac, bldg, div, dept, room 
Dim dateDue As Date 
Dim rArr As Variant 
Dim ws As Worksheet 

Set sh1 = ThisWorkbook.Sheets("Sheet1") 
Set eqWb = Workbooks.Open("C:\Code3\Equipment Log.xlsx") ' change this to your equipment sheet path 

wsNums = eqWb.Worksheets.Count 

    For Each ws In eqWb.Worksheets 
     ws.Activate 
     Set due = Cells.Find("Due") 
     Set ID = Cells.Find("ID") 
     Set room = Cells.Find("Room") 
     lrEq = Range("A" & Rows.Count).End(xlUp).Row 
     For i = (due.Row + 1) To lrEq 
      dateDue = Cells(i, due.Column) 
      dd = DateDiff("d", Date, dateDue) 
      If Abs(dd) < 30 Then 
       ' I'm assuming that the cells are all located in a row in the order you mentioned 
       rArr = Range(Cells(ID.Row + 1, ID.Column), Cells(room.Row + 1, room.Column)) 
       x = 1 
       lr = sh1.Range("A" & Rows.Count).End(xlUp).Row 
       For Each c In rArr 
        sh1.Cells(lr + 1, x) = c 
        x = x + 1 
       Next c 
       sh1.Cells(lr + 1, x + 1) = dateDue 
      End If 
     Next i 
    Next ws 
End Sub 
+0

Вы, Стобин, изумительны. Большое спасибо! Хотя, когда я запускаю программу (после ее небольшой настройки), она работает без ошибок, но ничего не выходит на исходном листе. Я уверен, что это то, что я пропускаю. – LudivousKain

+0

Я сделал это. Когда я делаю пошаговую отладку, сценарий выполняется красиво до ws.Activate. После того, как я начну проходить через этот цикл, установите соответствующие результаты в значение «Due», «Set ID» приведет к «ID» и т. Д. Когда он добирается до dateDue, он всегда сообщает 12:00 AM. dd заканчивается «Пусто». Наверное, это проблема ...? – LudivousKain

+0

Стобин, я просто хотел еще раз поблагодарить вас. Я понял проблему (это не проблема с вашим кодом, просто так вы знаете), исправил ее, и теперь она работает БЕСПЛАТНО. Вы, сэр, заслуживаете больше, чем 15 баллов за эту систему за одобренный ответ. – LudivousKain

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