2016-10-08 1 views
0

Код ниже выбирает вкладки в зависимости от цвета вкладки. Каждый лист отформатирован одинаково, они просто содержат разные значения. Я пытаюсь использовать .find и offset, чтобы найти конкретную ячейку (она соответствует текущей финансовой неделе плюс одна), а затем скопировать и вставить эту ячейку в качестве значений вместо формул. Приведенный ниже код выбирает нужные вкладки и находит правильную ячейку, но не копирует и не вставляет эту ячейку в качестве значений. Я пытаюсь не указывать листы конкретно, потому что этот код будет использоваться для нескольких книг с разными именами вкладок.копировать и вставлять определенную ячейку (используя .find) в массиве рабочих таблиц с помощью vba

Sub freeze() 

Dim ws As Worksheet 
Dim strg() As String 
Dim count As Integer 
count = 1 

For Each ws In Worksheets 
    If ws.Tab.Color = 255 Then 
     ReDim Preserve strg(count) As String 
     strg(count) = ws.Name 
     count = count + 1 
    Else 
    End If 

Next ws 
Sheets(strg(1)).Select 

Dim aCell As Range 
Set aCell = Range("B9:B79").Find(What:=Worksheets("EmailTemplate").Range("A1").Value) 

If Not aCell Is Nothing Then 
Sheets(strg(1)).aCell.Select 
    ActiveCell.Offset(0, 6).Select 
    Selection.copy 
    Selection.PasteSpecial xlPasteValues 
Else 
End If 

    For I = 2 To UBound(strg) 
    Sheets(strg(I)).Select False 

Next I 
End Sub 

Спасибо

+0

Я думаю, вы получите сообщение об ошибке? Всегда описывайте ошибку и где она происходит. [Здесь] (http://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/9292/avoid-using-select-or-activate) - вот несколько советов о том, как его избежать), некоторые советы о том, как использовать '.Select' и т. д. – arcadeprecinct

+0

Я запустил ваш код, но вам нужно больше информации. Может ли несколько листов быть красным (255)? Если да, у вас нет положения для использования нескольких листов в коде. Если вы найдете красный лист и найдите совпадение для своего поиска, вы копируете и вставляете поверх одной и той же ячейки. Это то, что вы хотите? Кроме того, мне нужно было изменить «Таблицы» (strg (1)). ACell.Select 'просто «aCell.Select» –

+0

Спасибо, что посмотрели на arcadecrecinct. На самом деле у меня нет ошибок. Он просто не будет вставляться в качестве значений. Остальная часть кода работает так, как ожидалось. – HeatherRW

ответ

1

Обновление № 2 (вс 11:15 EDT) Добавлены операторы отладки, которые помогут вам; Нужно добавить ссылку на «ActiveSheet» в коде «Найти», будет проходить через все «красные» листы, найти совпадение (если есть) и скопировать/вставить значения. отладка кода покажет штабист имена, значение поиска, результаты, формулу, значение

Option Explicit 

Sub freeze() 

Dim ws  As Worksheet 
Dim aCell As Range 
Dim strg() As String 
Dim count As Integer 
Dim i  As Integer 

count = 0 

' Get each RED sheet 
For Each ws In Worksheets 
    If ws.Tab.Color = 255 Then      ' Find only RED tabs 
     Debug.Print "-----------------------------------------------------------------------" 
     Debug.Print "Name of Red Sheet: '" & ws.Name & "'"  ' Debug... 
     'ReDim Preserve strg(count + 1) As String 
     'count = count + 1       ' This code not necessary as you can just reference the ws.name 
     'strg(count) = ws.Name      ' Ditto 

     Sheets(ws.Name).Select 
     Set aCell = ActiveSheet.Range("B9:B79").Find(What:=Worksheets("EmailTemplate").Range("A1").value) 
     If Not aCell Is Nothing Then 
      ActiveSheet.Cells(aCell.Row, aCell.column).Select 
      ActiveCell.Offset(0, 6).Select  ' Offset same row, + 6 columns 
      Debug.Print "Found Match for '" & Worksheets("EmailTemplate").Range("A1").value & _ 
       "' in: R" & aCell.Row & ":C" & aCell.column & vbTab & "Formula: '" & ActiveCell.Formula & "'; Value: '" & ActiveCell.value & "'" 
      ' Weird, but was unable to use 'aCell.Select' 2nd time thru loop 
      Selection.Copy 
      Selection.PasteSpecial xlPasteValues 
     Else 
      Debug.Print "Did NOT find a match for: '" & Worksheets("EmailTemplate").Range("A1").value & "' in sheet '" & ws.Name & "'" 
     End If 
     Application.CutCopyMode = False   ' Unselect cell 
    End If 
Next ws 

End Sub 
+0

спасибо, что вы еще раз посмотрели на это. Я вижу, что копия-паста работает - просто не так, как я надеялся. Он принимает формулу с одного из красных вкладок и вставляет ее в другие вкладки. Поскольку каждая красная вкладка будет иметь формулу, которая вычисляет определенное значение, я ищу способ жесткого кодирования этой конкретной ячейки на всех красных вкладках и сохранения каждого отдельного значения. Чтобы сделать это вручную, я бы выбрал все вкладки, затем выделил ячейку (она находится в одном месте на всех вкладках) и скопируйте, вставьте в качестве значений. – HeatherRW

+0

Извините, если я неправильно прочитал ваш первоначальный вопрос по этому вопросу. Я действительно ценю вашу помощь. Это первый раз, когда я занимался массивами и циклами, поэтому я все еще многому учусь. – HeatherRW

+0

Просьба пояснить: (1) Может ли быть несколько совпадений на одном красном листе или только одно совпадение (т. Е. У вас есть 6 строк с соответствующим значением)? (2) В вашем коде все красные листы, затем установите первый красный лист как текущий, затем выполните поиск, а затем скопируйте/вставьте ячейку, указанную смещением. Могу ли я просто скопировать значение из одного красного листа, а затем вставить все остальные? (3) Будет ли каждый красный лист всегда иметь совпадение в той же позиции ячейки? –

0

Вы не можете сделать это:

Sheets(strg(1)).aCell.Select 

лист уже хранится в объекте диапазоне aCell. Вы также не должны использовать select, и вставка значения не требуется. Вот что я сделал бы:

Dim aCell As Range 
Set aCell = Sheets(strg(1)).Range("B9:B79").Find(What:=Worksheets("EmailTemplate").Range("A1").Value) 

If Not aCell Is Nothing Then 
    aCell.Offset(0, 6).Value = aCell.Offset(0, 6).Value 
End If 

Я не понимаю, чего вы хотите достичь во втором цикле. .Select не принимает аргументы, я думаю? Редактировать: фактически .Select действительно принимает опцию replace, если применяется к рабочим листам для продления текущего выбора, извините за это!

+0

arcadeprecinct- спасибо за эти предложения. Я скорректировал свой код, как вы подробно описали выше. Сейчас код успешно выбирает правильные листы и даже выбирает правильную ячейку, однако она не вставляет в качестве значений. Значение в этой ячейке по-прежнему является формулой по какой-то причине. Второй цикл - это просто код, который я нашел в Интернете, я предположил, что это всего лишь двойная проверка, чтобы убедиться, что все не красные вкладки не выбраны. – HeatherRW

+0

@ arcadeprecinct- Я испортил второй цикл, и пока я не знаю, что он делает, я знаю, если он закомментирован, выбрана только одна вкладка по сравнению с тем, когда она является частью кода, все красные вкладки выбраны. – HeatherRW

+0

Код во втором цикле «отменит» лист, который вы только что обработали.Лучшим подходом было бы вернуть фокус (т. Е. Выбрать) лист, который вы начали с ... –

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