tod2020 Пользователь Сообщений: 261 |
#1 17.07.2017 13:03:28 Как правильно выглядит код для такой конструкции?
то есть Row определяется не для Worksheets(1) а для Range(«Table1») Прикрепленные файлы
Изменено: tod2020 — 17.07.2017 13:14:02 |
||
Garni Пользователь Сообщений: 333 |
#2 17.07.2017 13:14:13
|
||
tod2020 Пользователь Сообщений: 261 |
Garni, Не то. Нужно по имени диапазона |
Garni Пользователь Сообщений: 333 |
#4 17.07.2017 13:46:03 Тогда попробуйте так
Если надо найти порядковый номер строки таблицы из Столбца3, тогда
Изменено: Garni — 17.07.2017 13:57:50 |
||||
Илья Демид Пользователь Сообщений: 320 |
#5 17.07.2017 13:46:16 У меня работает, если вы имеете ввиду чтобы указывалась строка из таблицы то отнимите количество строк с шапкой (в примере это 4)
Будет код
|
||||
ZVI Пользователь Сообщений: 4328 |
#6 17.07.2017 13:52:40 Вариант:
Изменено: ZVI — 17.07.2017 13:55:33 |
||
tod2020 Пользователь Сообщений: 261 |
Всё что выше это всё многострочное сложное. Изменено: tod2020 — 17.07.2017 13:57:45 |
tod2020 Пользователь Сообщений: 261 |
#8 17.07.2017 14:01:28
это тоже не пойдет поскольку собьется нумерация со временем, только Row нужно заполучить |
||
Garni Пользователь Сообщений: 333 |
У Вас таблица из 4 строчек и вопрос о номере строки, в которой находится свекла. Вам предложили как минимум 4 варианта. Какую еще классификацию нам надо понять? Куда пойти записаться чтоб изучить структуру объекта из 4 строчек? |
tod2020 Пользователь Сообщений: 261 |
#10 17.07.2017 14:03:58
это не рабочий файл. в рабочих файлах десятки-сотни таблиц с сотнями-тысячами строк Изменено: tod2020 — 17.07.2017 14:04:35 |
||
Вы просто объяснить можете что Вы хотите на выходе получить? или результат сказать какой должен получится |
|
Garni Пользователь Сообщений: 333 |
Если у вас столько строчек, и не одна свекла обыкновенная там храниться, а еще свекла сахарная, свекла пареная, свекла испорченная и т.д. Тогда Find завершит поиск на первой найденной. Так какую строчку найти надо? |
tod2020 Пользователь Сообщений: 261 |
Как правильно выглядит код для такой конструкции? Worksheets(1).Range(«Table1»).[ХХХХХХХХХХХХ].Find(«свекла»).Row то есть Row определяется не для Worksheets(1) а для Range(«Table1») PS Был бы listObject вместо XXX стояло бы DataBodyRange Изменено: tod2020 — 17.07.2017 14:15:36 |
ZVI Пользователь Сообщений: 4328 |
#14 17.07.2017 14:18:38
С точки зрения правил программирования Ваше «нужно» некорректное.
Изменено: ZVI — 17.07.2017 14:43:32 |
||||
Garni Пользователь Сообщений: 333 |
Вам ответ дал Илья Демид, в сообщении #6. Значение Row будет для являться для листа, если Вы хотите вычислить номер строки для таблицы по средствам VBA, то в лаконичную одну строку это не уберется |
tod2020 Пользователь Сообщений: 261 |
#16 17.07.2017 14:22:13 Есть и такой вариант
Но по задаче поставленной в теме говориться о такой конструкции: Как правильно выглядит код для такой конструкции? Подмена Range на ListObject не нужна Изменено: tod2020 — 17.07.2017 14:29:59 |
||
Слово задача убило наповал… Уважаемый tod2020 для задач есть платный раздел |
|
tod2020 Пользователь Сообщений: 261 |
#18 17.07.2017 14:33:49
Я не требую. У Вас такая реакция(набор мыслеформ и картинка и интонация) на слово «задача» наверно с работы, но не всё так однобоко Каждый кто отвечает на этих формах в этих темах решает задачи поставленные в теме. Я не требую большего чем тут принято. Как вещи называются так и называю И наверно потому заставляю себя говорить спасибо потому что человек отвечающий решает свои задачи для себя, он уже получает себе чтото там Как детскому саду всё разжевываю Изменено: tod2020 — 17.07.2017 14:44:29 |
||
ZVI Пользователь Сообщений: 4328 |
В примере была таблица, поэтому в ответе и ListObject. Изменено: ZVI — 17.07.2017 14:41:46 |
Илья Демид Пользователь Сообщений: 320 |
#20 17.07.2017 14:40:39 Вы ошибаетесь, но да ладно. Если я правильно понял то необходим вариант который бы сам вычислял в какой строке находится шапка и отнимал ее сам, Как насчет такого, но не 1 строкой:
Изменено: Илья Демид — 17.07.2017 14:41:38 |
||
AndreTM Пользователь Сообщений: 454 |
тод2020, я уже упоминал вроде, что вы — не читатель? В том сообщении вам был дан тот ответ, что вы требуете здесь (в одну строчку тот код переписывается просто на раз-два). |
tod2020 Пользователь Сообщений: 261 |
#22 17.07.2017 14:45:54
Что это значит? |
||
tod2020 Пользователь Сообщений: 261 |
Чтож за такое то происходит? дают груши лишь потомуто не знают что существует красное яблоко или потомучто просто напросто нету его в наличии Изменено: tod2020 — 17.07.2017 14:53:08 |
tod2020 Пользователь Сообщений: 261 |
#25 17.07.2017 14:54:55
Что Вы хотели этим сказать? Изменено: tod2020 — 17.07.2017 14:55:47 |
||
vikttur Пользователь Сообщений: 47199 |
Пусть определят участники тем — дубль или нет. Я вижу, что разница в названии — «диапазон» и «умная таблица». Вы считаете, что диапазон умной таблицы — не диапазон? |
tod2020 Пользователь Сообщений: 261 |
#27 17.07.2017 14:56:53
Меня ваще не слышат — не понимают что я уже 3 раза продублировал самого начала запроса темы Изменено: tod2020 — 17.07.2017 15:00:24 |
||
AndreTM Пользователь Сообщений: 454 |
Короче, народ — нас явно троллят Предлагаю закончить все разборы и уточнения, ибо то, что ТС — китаец из индии, было понятно ещё в старой теме примерно с третьего его поста |
vikttur Пользователь Сообщений: 47199 |
#29 17.07.2017 15:02:46
В VBA здесь разбираются многие. А вот Вас не понимают.
Не стоит ли задуматься? Если Вас не слышат многие — проблема в Вас, В том, как Вы доносите информацию. Или неправы все, кроме одного? |
||||
tod2020 Пользователь Сообщений: 261 |
#30 17.07.2017 15:06:39
Я думаю очень разный уровень понимания. Например это может проявляться в контактах с регионами. Ваще тяжко бывает. В москве легко улавливают меня с полу слова Изменено: tod2020 — 17.07.2017 15:07:06 |
||
Свойства Row и Rows объекта Range в VBA Excel. Возвращение номера первой строки и обращение к строкам смежных и несмежных диапазонов.
Range.Row — свойство, которое возвращает номер первой строки в указанном диапазоне.
Свойство Row объекта Range предназначено только для чтения, тип данных — Long.
Если диапазон состоит из нескольких областей (несмежный диапазон), свойство Range.Row возвращает номер первой строки в первой области указанного диапазона:
Range(«B3:F10»).Select MsgBox Selection.Row ‘Результат: 3 Range(«E8:F9,D4:G13,B2:F10»).Select MsgBox Selection.Row ‘Результат: 8 |
Для возвращения номеров первых строк отдельных областей несмежного диапазона используется свойство Areas объекта Range:
Range(«E8:F9,D4:G13,B2:F10»).Select MsgBox Selection.Areas(1).Row ‘Результат: 8 MsgBox Selection.Areas(2).Row ‘Результат: 4 MsgBox Selection.Areas(3).Row ‘Результат: 2 |
Свойство Range.Rows
Range.Rows — свойство, которое возвращает объект Range, представляющий коллекцию строк в указанном диапазоне.
Чтобы возвратить одну строку заданного диапазона, необходимо указать ее порядковый номер (индекс) в скобках:
Dim myRange As Range Set myRange = Range(«B4:D6»).Rows(1) ‘Возвращается диапазон: $B$4:$D$4 Set myRange = Range(«B4:D6»).Rows(2) ‘Возвращается диапазон: $B$5:$D$5 Set myRange = Range(«B4:D6»).Rows(3) ‘Возвращается диапазон: $B$6:$D$6 |
Самое удивительное заключается в том, что выход индекса строки за пределы указанного диапазона не приводит к ошибке, а возвращается диапазон, расположенный за пределами исходного диапазона (отсчет начинается с первой строки заданного диапазона):
MsgBox Range(«B4:D6»).Rows(12).Address ‘Результат: $B$15:$D$15 |
Если указанный объект Range является несмежным, состоящим из нескольких смежных диапазонов (областей), свойство Rows возвращает коллекцию строк первой области заданного диапазона. Для обращения к строкам других областей указанного диапазона используется свойство Areas объекта Range:
Range(«E8:F9,D4:G13,B2:F10»).Select MsgBox Selection.Areas(1).Rows(2).Address ‘Результат: $E$9:$F$9 MsgBox Selection.Areas(2).Rows(2).Address ‘Результат: $D$5:$G$5 MsgBox Selection.Areas(3).Rows(2).Address ‘Результат: $B$3:$F$3 |
Определение количества строк в диапазоне:
Dim r As Long r = Range(«D4:K11»).Rows.Count MsgBox r ‘Результат: 8 |
First Cell in Column Function
It is assumed that you’re looking for a VBA function to use in Excel to calculate the first non-empty row of a column (specified by a range).
Features
- The
Volatile
method marks a user-defined function as volatile. A
volatile function must be recalculated whenever calculation occurs in
any cells on the worksheet. A nonvolatile function is recalculated
only when the input variables change (VBA Help). - At least for the sake of correctness, you have to use
IsEmpty
instead of «» for the reason e.g. if the cell in the resulting row
contains a formula that evaluates to «», it will be ignored. - The Find Method Version uses the Find method to calculate the First Row, which is safer than
the End Version e.g. if you input a value into the first cell of the
column i.e. the result is 1 and you hide the first row, the result of
the End Version will not be 1. - The formula can be inserted in the same column as
SelectRange
Column. In some cases the End Version would not show the correct
result or create a circular reference. ThereforeThisCell
is used
in the End version and 0 is returned if no value was found inSelectRange
column.
Find Method Version
Function FirstRowFind(SelectRange As Range) As Long
Application.Volatile
Dim FirstCell As Range
With Columns(SelectRange.Column)
Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
End With
If Not FirstCell Is Nothing Then
FirstRowFind = FirstCell.Row
End If
End Function
Find Method
Instead of
Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
you can use
Set FirstCell = .Find("*", .Cells(.Cells.Count), _
xlFormulas, xlWhole, xlByColumns, xlNext)
or
Set FirstCell = .Find(What:="*", After:=.Cells(.Cells.Count), _
LookIn:=xlFormulas, LookAt:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext)
The parameters for the arguments LookAt
(unimportant in this case) and SearchDirection
(Default is Next
) can be omitted, but since I couldn’t find any difference in efficiency, I didn’t.
Usage in Excel
For Column AB
:
=FirstRowFind(AB1)
=FirstRowFind(AB20)
=FirstRowFind(AB17:AH234)
End Version (Not recommended)
Function FirstRowEnd(SelectRange As Range) As Long
Application.Volatile
Dim FirstCell As Range
If Application.ThisCell.Column = SelectRange.Column Then Exit Function
If Not IsEmpty(SelectRange.Cells(1)) Then
FirstRowEnd = 1
Else
Set FirstCell = Cells(1, SelectRange.Column).End(xlDown)
FirstRowEnd = FirstCell.Row
If FirstRowEnd = Rows.Count And IsEmpty(FirstCell) Then
FirstRowEnd = 0
End If
End If
End Function
Usage in Excel
For Column AB
:
=FirstRowEnd(AB1)
=FirstRowEnd(AB20)
=FirstRowEnd(AB17:AH234)
I have the following problem and it’s driving me NUTS! I work on a large database program in Excel, and I’m trying to retrieve the row and column numbers of specific named ranges. The following code used to work (temp_entryvalue is the name of the range):
temp_datafile_row = Workbooks(datafile_filepath).Worksheets(temp_datafile_worksheet).Range(temp_entryvalue).Row
temp_datafile_col = Workbooks(datafile_filepath).Worksheets(temp_datafile_worksheet).Range(temp_entryvalue).Column
I get the ole’ Error 1004. Troubleshooting a bit, the problem here seems to be that the range associated with temp_entryvalue is hidden in the excel sheet, however the name is defined and there is a row and column number assigned to.
This however, all used to work. Until I changed one thing: instead of writing directly to the database excel worksheet, I first put everything in an array, so that only at the very end I open the database worksheet and copy all the data. Before I did this, everything used to work fine.
So how do I fix this? How do I retrieve the row and column number of a Named Range that is hidden, but DOES have a row and column number associated to it?
Thanks.
boomrest 10 / 10 / 3 Регистрация: 01.09.2011 Сообщений: 92 |
||||
1 |
||||
Как из адреса ячейки получить просто номер строки?25.04.2017, 12:25. Показов 9265. Ответов 3 Метки нет (Все метки)
В результате выводит адрес ячейки, например J43, а мне нужно просто номер строки 43, чтобы потом использовать в цикле. Спасибо!
0 |
132 / 108 / 22 Регистрация: 23.06.2015 Сообщений: 339 |
|
25.04.2017, 16:49 |
2 |
boomrest, нужен файл пример,что дано и что нужно получить,а не вариант кода,попробуйте протестируйте макрос test и приспособьте под Ваш вариант кода. Код Sub test() MsgBox Split(Range("B10").Address, "$")(2) End Sub
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
25.04.2017, 17:36 |
3 |
|||
Для тех, кто не страдает извращениями
0 |
132 / 108 / 22 Регистрация: 23.06.2015 Сообщений: 339 |
|
25.04.2017, 23:02 |
4 |
boomrest, протестируйте также макрос test1(для случая диапазона) Код Sub test1() Dim t1$: t1 = Range("B10:D2017").Address(0, 0) With CreateObject("VBScript.RegExp"): .Pattern = "d+": .Global = True MsgBox .Execute(t1)(.Execute(t1).Count - 1) End With End Sub
0 |