2015-01-28 2 views
0

Я пытаюсь написать макрос, который копирует строку, если конкретная ячейка в этой строке содержит текст (столбец C), я искал в Интернете и нашел те, которые имеют дело с копированием строк с конкретным текстом, но я хочу написать тот, который копирует его независимо от того, какой текст содержится в ячейке.Скопируйте строку, если ячейка имеет текст

Например, если есть 30 строк, но только 10 содержат текст в столбце C, я хочу, чтобы он скопировал эти 10 строк и ввел их в лист «Сводка действий».

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

спасибо.

+2

Ну, вам просто нужно проверить, не является ли ячейка пустой или нет. Итерации по строкам, затем проверьте столбец c: 'If Cells (x, 3) <>" "Then ...' где x представляет вашу строку. – EngJon

+0

[Что вы пытались?] (Http://stackoverflow.com/help/on-topic) – Chrismas007

ответ

1

Возможно:

Sub SmartCopy() 
    Dim s1 As Worksheet, s2 As Worksheet 
    Dim N As Long, i As Long, j As Long 
    Set s1 = Sheets("Sheet1") 
    Set s2 = Sheets("Action Summary") 
    N = s1.Cells(Rows.Count, "C").End(xlUp).Row 
    j = 1 
    For i = 1 To N 
     If s1.Cells(i, "C").Value = "" Then 
     Else 
      s1.Cells(i, "C").EntireRow.Copy s2.Cells(j, 1) 
      j = j + 1 
     End If 
    Next i 
End Sub 

Update на лист имена, чтобы соответствовать вашим требованиям.

+0

argh это почти идеально, он делает именно то, что я хочу, но мне нужно, чтобы он начал поиск из строки 7 и далее, извините, что я действительно новичок в этом! – user3514907

+0

Ничего, что я сработал! Спасибо за помощь!!! – user3514907

-1

Вы можете использовать оператор If, чтобы определить, если ячейка содержит текст, используя что-то вроде:

If IsNumeric(rCell.Value) = False And _ 
IsError(rCell.Value) = False And _ 
IsDate(rCell.Value) = False Then 

первая строка проверяет значение не является числом, то следующие проверки не сообщение об ошибке из формулы и последние проверки это не дата, поскольку они могут быть ошибочно приняты за текст в зависимости от того, как они отформатированы.

Затем добавьте свой код, чтобы скопировать строку, которую вы уже нашли.

0

Попробуйте

Private Sub CopyNonBlank() 
    Dim destWS As Worksheet ' Destination worksheet 
    Set destWS = ThisWorkbook.Worksheets("Action Summary") 
    Dim i As Long: i = 1 
    For Each cell In Range("C2:C32") 
     If Len(cell.Value) > 0 Then ' if cell is not empty lenght would be greater than 0 
      destWS.Range("A" & i).Value = cell.Value 
      i = i + 1 
     End If 
    Next cell 
End Sub 
+0

Это почти делает то, что я хочу, но мне нужно скопировать всю строку в итоговый лист, когда столбец C имеет текст и есть строка заголовка, поэтому он должен начинать вставлять их в строку 2. – user3514907

0

Нечто подобное, то:

дим у As Integer

y = 1 
For x = 1 To 30 
    If Sheets(1).Cells(x, 3) <> "" Then 
     Do While Sheets("Action Summary").Cells(y, 3) <> "" 
      y = y + 1 
     Loop 
     Sheets(1).Rows(x).Copy Destination:=Sheets("Action Summary").Rows(y) 
     y = 1 
    End If 

Next x 

это петли, хотя первые 30 строк листа одного, то при нахождении значения в колонке с (что колонка 3) его циклически проходит через значения столбца c в листе «Сводка действий», увеличивая значение переменной y до тех пор, пока не найдет пустую строку для вставки, затем копирует всю строку x листа 1 в строку y листа «Резюме действия».

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