Excel Если только заявления для UsedRange? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть макрос, настроенный в Excel, который берет некоторые вставленные данные и разбирает их на новый лист.Оттуда я хотел бы, чтобы он прочитал, если значение существует в любой ячейке в столбце K, и если это так, помещает значение на моем первом листе в ту же строку, но в столбец Q.

Немного запутанно, Мне жаль.Я пытался

If Range("K:K") <> "" Then
   Range("Q:Q") = ("Input!R2C2")
End If

Но, как он читает, он заполняет данные для всего столбца Q. Я хочу, чтобы он только заполнял данные, где значение существует в столбце K.

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Это найдет вашу последнюю использованную строку, а затем запустит цикл вниз по K и добавит значение к той же строке в столбце Q. Вы сможете изменить это для достижения своей цели. Обратите внимание, что вам придется вносить изменения, чтобы ссылаться на разные листы (изменить названия листов, которые у меня есть). Кроме того, если у вас есть заголовки, это нужно изменить, чтобы начать с

 i = 2 to Lrow 

Параметр Явный

Sub Add()


Dim LRow As Long
Dim WB As Workbook
Set WB = ThisWorkbook
Dim i As Integer

LRow = WB.Sheets("Sheet1").UsedRange.Rows.Count

For i = 1 To LRow
If WB.Sheets("Sheet1").Range("K" & i) <> "" Then
    WB.Sheets("Sheet1").Range("Q" & i) = ("Add Input Here")
        End If
Next i

End Sub
0 голосов
/ 17 мая 2018

Я бы использовал функцию counta, которая просто считает все ячейки, которые заполнены в диапазоне.Если оно равно нулю, ячейки не заполняются.Он будет больше нуля, если заполнить одну или несколько ячеек.

If Application.WorksheetFunction.CountA(Range("K:K")) > 0 Then
   Range("Q:Q") = ("Input!R2C2")
End If
0 голосов
/ 17 мая 2018

«Я хочу, чтобы он только заполнял данные, если в столбце K есть значение.»
Для этого вам нужно перебрать строки.

Option Explicit

Public Sub FillDataInQWhereValueInK()

    Dim LastRow As Long
    LastRow = Cells(Rows.Count, "K").End(xlUp).Row 'find last used row

    Dim iRow As Long
    For iRow = 1 To LastRow 'loop through all rows
        If Cells(iRow, "K") <> vbNullString Then 'check if K has a value
            Cells(iRow, "Q") = "Input!R2C2" 'write in Q if K has a value
            'here you can access any other cell in the row where K has a value
            'Cells(iRow, "A").Font.Color = vbRed
            'or access the complete row by
            'Rows(iRow)
        End If
    Next iRow
End Sub
0 голосов
/ 17 мая 2018
Public Sub TestMe()
    Debug.Print WorksheetFunction.CountA(Range("K:K"))
End Sub

Это вывело бы 0, если оно не используется и что-либо выше 0, если оно используется. Таким образом, вы можете использовать его для чего-то вроде этого:

Public Sub TestMe()
    If WorksheetFunction.CountA(Range("K:K")) Then 'if any value is present
        Range("Q:Q") = 1
    Else
        Range("Q:Q") = 0
    End If
End Sub

Однако, поскольку вы упомянули «Я хочу, чтобы он только заполнял данные, в которых есть значение в столбце K.», вы можете проходить только через ячейки со значениями в них и записывать «Something» 6 столбцов в право:

Public Sub TestMe()

    Dim myCell As Range

    For Each myCell In Range("K:K").SpecialCells(xlCellTypeConstants)
        myCell.Offset(0, 6) = "Something"
    Next myCell

End Sub

Приведенное выше решение будет работать только в том случае, если в Range("K:K") есть значения без формул. Если у вас есть формулы, они не будут работать для них, а если у вас ничего нет, будет возвращена ошибка. Таким образом, вероятно, лучше будет выполнить цикл от последней к первой и проверить, пуста ли ячейка или нет, как в этой - https://stackoverflow.com/a/50395958/5448626

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...