Почему мой VBA с относительными ссылками возвращает неправильные ссылки? - PullRequest
0 голосов
/ 05 мая 2018

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

QueryDatabase Worksheets("TablesAndFields").Range("A2:R20"), Worksheets("TablesAndFields"), Worksheets("Import")

Вот первая строка в подпункте:

Sub QueryDatabase(QuerySpecs As Range, QuerySheet As Worksheet, TargetSheet As Worksheet)

Одна из вещей, которые мне нужно сделать, - это чтобы VBA вычислил ряд последних полей в различных столбцах. Вот мой текущий код:

LastRowReportTables = QuerySpecs.Offset(0, 3).End(xlDown).Row
LastRowQuery = QuerySpecs.Offset(0, 6).End(xlDown).Row
LastRowSort = QuerySpecs.Offset(0, 14).End(xlDown).Row

Возвращает одинаковое значение для всех 3 из них (вторая строка диапазона). Кажется, это происходит независимо от того, в каких ячейках есть значения. Например, в случае указанного выше диапазона он вернет 3. Если диапазон равен «A22: R40», он возвращает 23. Что мне действительно нужно, так это чтобы он возвратил строку относительно своей позиции в диапазоне, но я может подделать это, если необходимо, вычитая наибольшее кратное 20 меньше, чем результат. (Я форматирую свой построитель запросов, чтобы он поместился в 19 строк + строку буфера.) До сих пор я даже не смог заставить его возвращать разные результаты для переменных LastRow.

В дополнение к методу смещения, который вы видите выше, я также попытался поместить его в блок With QuerySpecs ... End With. Я не помню точный результат, но я не мог заставить это работать.

Следующее, что мне нужно будет сделать, это вытащить значения из различных ячеек вроде этого:

strStartCell = QuerySpecs.Offset(0, 18).Value

Это приводит к ошибке времени выполнения 13: Несоответствие типов. Кто-нибудь есть какие-либо советы о том, как достичь моих целей? Спасибо вам!

1 Ответ

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

Предлагаю прочитать документацию по ресурсам, которые вы пытаетесь использовать.

Это можно сделать, выбрав слово, которое вы хотите найти в документации, затем нажмите клавишу [F1], чтобы перейти на страницу документации Microsoft (т. Е. Если вы выберете Row и нажмите [F1] перенесет вас на страницу Range.Row Property (Excel) .

Чтение документации по Row и Offset поможет вам понять эти Range.Properties и результаты, которые вы получаете от своего кода.

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

With WorksheetFunction
    LastRowReportTables = .CountA(QuerySpecs.Columns(4))
    LastRowQuery = .CountA(QuerySpecs.Columns(7))
    LastRowSort = .CountA(QuerySpecs.Columns(15))
End With

Примечание: если «QuerySpecs» range является разновидностью базы данных, все столбцы в полях должны иметь одинаковое количество записей, если это так, этого должно быть достаточно для получения последней строки для одного поля только.

Чтобы получить значение ячейки в диапазоне, используйте эту строку:

Возвращает значение поля (column) 18, row 13 из QuerySpecs range

strStartCell = QuerySpecs.Cells(13, 18).Value2

Run-time error 13: Type mismatch генерируется при попытке присвоить массив строковой переменной.

...