Excel vba значение соседней ячейки

Вывод значения соседней ячейки при особом условии + цвет

SSre

Дата: Воскресенье, 16.05.2021, 11:23 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 14


Репутация:

2

±

Замечаний:
0% ±


Здравствуйте!
Нужен макрос, который:
найдет все строки содержащие в столбце D определенную цифру (в примере это цифра 1 и 2),
проверит, что у найденных строк столбцы имеют дату в определенной строке (в примере это строка 1)
и в каждой ячейке, которая соответствует описанным выше условиям вывести значение (не формулу, а именно значение), соответствующее ячейке на одну ниже и правее (т.е. в ячейке F4 должно отобразиться значение G5)
если значение отобразилось, т.е. в ячейку что-то добавилось, красить ее определенным цветом. Если не добавилось, оставлять не закрашенной.

Сейчас работает через формулу =ЕСЛИ(И((ЕПУСТО(G5)=ЛОЖЬ);ЕЧИСЛО(F1);$D$4=2);G5;»») и цвет устанавливается вручную (или через условное форматирование).
Проблема в том, что формулы нужно руками копировать в нужные строки (т.е. сам определяю, в какой строке 1 или 2 и копирую туда)
Файл прикрепил с примером прикрепил.

Перевел формулу в код и сделал вывод только значениями. Но, все равно приходится указывать нужные строки руками и ячейки не перекрашиваются.
Немного скорректировал формулу, что бы в в первой проверяемой ячейке искало не «число», а просто проверяло, что она не пустая.
[vba]

Код

Sub Макрос1()
    Range(«F4:U4»).Select
    Range(«F4:U4»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-3]C),R4C4=2),R[1]C[1],»»»»)»
        Range(«F4:U4»).Value = Range(«F4:U4»).Value
    Range(«F3:U3»).Select
    Range(«F3:U3»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-2]C),R3C4=1),R[1]C[1],»»»»)»
        Range(«F3:U3»).Value = Range(«F3:U3»).Value

            End Sub

[/vba]

Сообщение отредактировал SSreВоскресенье, 16.05.2021, 12:18

 

Ответить

Pelena

Дата: Воскресенье, 16.05.2021, 15:13 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
Не уверена, что правильно поняла

К сообщению приложен файл:

_1.xlsm
(18.4 Kb)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

SSre

Дата: Воскресенье, 16.05.2021, 16:19 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 14


Репутация:

2

±

Замечаний:
0% ±


Не уверена, что правильно поняла

Да, работает отлично! спасибо:)
Немного скорректировал под себя:
1) убрал повторный запуск (по нажатию на кнопку второй раз) для расчета для условия «ячейка в столбце D=1». Не очень удобно нажимать второй раз, лучше добавлю в отдельный макрос и создам цепочку из макросов.
2) сделал удаление данных из ячейки и ее обесцвечивание, если ячейка ниже и правее пустая.
Тот код, который получился у меня после упрощения
[vba]

Код

Sub wwww()
    Dim lrow&, lcol&, ir&, ic&
    lrow = Cells(Rows.Count, 4).End(xlUp).Row
    lcol = Cells(1, Columns.Count).End(xlToLeft).Column
    For ir = 1 To lrow
        If Cells(ir, 4) = 2 Then
            For ic = 6 To lcol
                If Cells(1, ic) <> «» And Cells(ir + 1, ic + 1) = «» Then Cells(ir, ic) = «»: Cells(ir, ic).Interior.Color = xlNone
                If Cells(1, ic) <> «» And Cells(ir + 1, ic + 1) <> «» Then Cells(ir, ic) = Cells(ir + 1, ic + 1): Cells(ir, ic).Interior.Color = vbYellow
            Next ic
        End If
    Next ir
End Sub

[/vba]
Остался один вопрос уровня «полный новичок»: как понять, что делает макрос (т.е. как это работает)?

Надеюсь, что я правильно понимаю:
[vba]

Код

For ir = 1 To lrow ‘задаем параметру ir все значения от 1 до последней строки

[/vba]
[vba]

Код

If Cells(ir, 4) = 2 Then ‘если ячейка по строке ir и столбцу D = 2, тогда выполняем следующий пункт

[/vba]
[vba]

Код

For ic = 6 To lcol ‘задаем параметру ic все значения от столбца F до последнего столбца

[/vba]
[vba]

Код

If Cells(1, ic) <> «» And Cells(ir + 1, ic + 1) <> «» Then Cells(ir, ic) = Cells(ir + 1, ic + 1): Cells(ir, ic).Interior.Color = vbYellow ‘если ячейка по строке 1 и столбцу сформированному параметром ic не пустая И ячейка ниже+правее от сформированной параметрами ir ic не пустая, то выбирается значение ячейки ниже+правее и красится в желтый

[/vba]

Беда в том, что я не понимаю:
[vba]

Код

    Dim lrow&, lcol&, ir&, ic&
    lrow = Cells(Rows.Count, 4).End(xlUp).Row
    lcol = Cells(1, Columns.Count).End(xlToLeft).Column

[/vba]
[vba][/vba]

 

Ответить

Pelena

Дата: Воскресенье, 16.05.2021, 16:25 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Dim lrow& — это то же самое, что Dim lrow as Long — объявление переменных целого типа
а дальше просто формулы для определения последней заполненной строки в четвёртом столбце и последнего заполненного столбца в первой строке


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

SSre

Дата: Воскресенье, 16.05.2021, 16:33 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 14


Репутация:

2

±

Замечаний:
0% ±


 

Ответить

Содержание

  1. Vba excel получить значение соседней ячейки
  2. Получение значений соседних ячеек вокруг текущей ячейки в Excel VBA
  3. 2 ответа
  4. VBA в Excel Объект Excel.Range и программная работа с ячейками средствами VBA
  5. 10.6 Объект Range, его свойства и методы

Vba excel получить значение соседней ячейки

Здравствуйте!
Нужен макрос, который:
найдет все строки содержащие в столбце D определенную цифру (в примере это цифра 1 и 2),
проверит, что у найденных строк столбцы имеют дату в определенной строке (в примере это строка 1)
и в каждой ячейке, которая соответствует описанным выше условиям вывести значение (не формулу, а именно значение), соответствующее ячейке на одну ниже и правее (т.е. в ячейке F4 должно отобразиться значение G5)
если значение отобразилось, т.е. в ячейку что-то добавилось, красить ее определенным цветом. Если не добавилось, оставлять не закрашенной.

Сейчас работает через формулу =ЕСЛИ(И((ЕПУСТО(G5)=ЛОЖЬ);ЕЧИСЛО(F1);$D$4=2);G5;»») и цвет устанавливается вручную (или через условное форматирование).
Проблема в том, что формулы нужно руками копировать в нужные строки (т.е. сам определяю, в какой строке 1 или 2 и копирую туда)
Файл прикрепил с примером прикрепил.

Перевел формулу в код и сделал вывод только значениями. Но, все равно приходится указывать нужные строки руками и ячейки не перекрашиваются.
Немного скорректировал формулу, что бы в в первой проверяемой ячейке искало не «число», а просто проверяло, что она не пустая.
[vba]

Sub Макрос1()
Range(«F4:U4»).Select
Range(«F4:U4»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-3]C),R4C4=2),R[1]C[1],»»»»)»
Range(«F4:U4»).Value = Range(«F4:U4»).Value
Range(«F3:U3»).Select
Range(«F3:U3»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-2]C),R3C4=1),R[1]C[1],»»»»)»
Range(«F3:U3»).Value = Range(«F3:U3»).Value

Здравствуйте!
Нужен макрос, который:
найдет все строки содержащие в столбце D определенную цифру (в примере это цифра 1 и 2),
проверит, что у найденных строк столбцы имеют дату в определенной строке (в примере это строка 1)
и в каждой ячейке, которая соответствует описанным выше условиям вывести значение (не формулу, а именно значение), соответствующее ячейке на одну ниже и правее (т.е. в ячейке F4 должно отобразиться значение G5)
если значение отобразилось, т.е. в ячейку что-то добавилось, красить ее определенным цветом. Если не добавилось, оставлять не закрашенной.

Сейчас работает через формулу =ЕСЛИ(И((ЕПУСТО(G5)=ЛОЖЬ);ЕЧИСЛО(F1);$D$4=2);G5;»») и цвет устанавливается вручную (или через условное форматирование).
Проблема в том, что формулы нужно руками копировать в нужные строки (т.е. сам определяю, в какой строке 1 или 2 и копирую туда)
Файл прикрепил с примером прикрепил.

Перевел формулу в код и сделал вывод только значениями. Но, все равно приходится указывать нужные строки руками и ячейки не перекрашиваются.
Немного скорректировал формулу, что бы в в первой проверяемой ячейке искало не «число», а просто проверяло, что она не пустая.
[vba]

Sub Макрос1()
Range(«F4:U4»).Select
Range(«F4:U4»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-3]C),R4C4=2),R[1]C[1],»»»»)»
Range(«F4:U4»).Value = Range(«F4:U4»).Value
Range(«F3:U3»).Select
Range(«F3:U3»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-2]C),R3C4=1),R[1]C[1],»»»»)»
Range(«F3:U3»).Value = Range(«F3:U3»).Value

Сообщение Здравствуйте!
Нужен макрос, который:
найдет все строки содержащие в столбце D определенную цифру (в примере это цифра 1 и 2),
проверит, что у найденных строк столбцы имеют дату в определенной строке (в примере это строка 1)
и в каждой ячейке, которая соответствует описанным выше условиям вывести значение (не формулу, а именно значение), соответствующее ячейке на одну ниже и правее (т.е. в ячейке F4 должно отобразиться значение G5)
если значение отобразилось, т.е. в ячейку что-то добавилось, красить ее определенным цветом. Если не добавилось, оставлять не закрашенной.

Сейчас работает через формулу =ЕСЛИ(И((ЕПУСТО(G5)=ЛОЖЬ);ЕЧИСЛО(F1);$D$4=2);G5;»») и цвет устанавливается вручную (или через условное форматирование).
Проблема в том, что формулы нужно руками копировать в нужные строки (т.е. сам определяю, в какой строке 1 или 2 и копирую туда)
Файл прикрепил с примером прикрепил.

Перевел формулу в код и сделал вывод только значениями. Но, все равно приходится указывать нужные строки руками и ячейки не перекрашиваются.
Немного скорректировал формулу, что бы в в первой проверяемой ячейке искало не «число», а просто проверяло, что она не пустая.
[vba]

Sub Макрос1()
Range(«F4:U4»).Select
Range(«F4:U4»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-3]C),R4C4=2),R[1]C[1],»»»»)»
Range(«F4:U4»).Value = Range(«F4:U4»).Value
Range(«F3:U3»).Select
Range(«F3:U3»).FormulaR1C1 = «=IF(AND((ISBLANK(R[1]C[1])=FALSE),ISNUMBER(R[-2]C),R3C4=1),R[1]C[1],»»»»)»
Range(«F3:U3»).Value = Range(«F3:U3»).Value

Источник

Получение значений соседних ячеек вокруг текущей ячейки в Excel VBA

Я хочу получить значения соседних ячеек для расчета в VBA.

Легко получить левую ячейку текущей ячейки (например, H19) обычно так:

Если я копирую эту ячейку в другие ячейки, каждая из них заменяется соответствующим номером ячейки.

Но в коде VBA я не уверен, правильно ли я получаю значение левой ячейки.

Я не уверен, что это правильно, я протестировал копирование этой ячейки в другие ячейки, но каждый результат не изменяется автоматически.

Я нажал на все виды кнопок «Расчет» в меню, изменил «Расчет» на «Автоматический», но никаких расчетов не происходит.

Единственный способ сделать это — вручную выбрать каждую ячейку и нажать клавишу ввода.

Есть ли способ рассчитать все значения ячеек? Иначе «Активная ячейка» означает «Выбранная ячейка курсором»?

Заранее благодарны за Вашу помощь.

2 ответа

Добавление формулы, как предлагает @Chris Harper, будет работать, но тогда вы можете просто написать формулу в ячейке.

Вместо ActiveCell вам нужна ячейка, которая вызвала формулу.

Редактировать: если вы хотите, чтобы ячейка обновлялась при каждом изменении значения, добавьте Application.Volatile True в качестве первой строки в функции.

Метод расчета в Excel VBA делает все виды расчетов. Вы даже можете определить диапазон для вычисления только диапазона определенных ячеек, таких как «Рабочие листы» («Лист1»).

Да, ActiveCell всегда является выбранной ячейкой.

Источник

VBA в Excel Объект Excel.Range и программная работа с ячейками средствами VBA

10.6 Объект Range, его свойства и методы

Объект Excel.Range, программная работа с ячейками и диапазонами (наборами) ячеек средствами VBA, создание объекта Excel.Range, свойства, методы и события объекта Excel.Range

Пожалуй, наиболее часто используемый объект в иерархии объектной модели Excel — это объект Range. Этот объект может представлять одну ячейку, несколько ячеек (в том числе несмежные ячейки или наборы несмежных ячеек) или целый лист. Если в Word вы могли для ввода данных использовать как объект Range, так и объект Selection, то в Excel все сводится к объекту Range:

  • если вам нужно ввести данные в ячейку или отформатировать ее, то вы должны получить объект Range, представляющий эту ячейку;
  • если вы хотите сделать что-то с выделенными вами ячейками, вам необходимо получить объект Range, представляющий выделение;
  • если вам нужно просто что-то сделать с группой ячеек, первое ваше действие — опять-таки получить объект Range, представляющий эту группу ячеек.

В Microsoft Knowledge Base есть статья под номером 291308, в котором описываются 22 способа получения объекта Range в Excel. Вряд ли вы будете пользоваться всеми эти способами. Мы рассмотрим только самые распространенные:

  • самый простой и очевидный способ — воспользоваться свойством Range. Это свойство предусмотрено для объектов Application, Worksheet и самого объекта Range (если вы решили создать новый диапазон на основе уже существующего). Например, получить ссылку на объект Range, представляющий ячейку A1, можно так:

Dim oRange As Range

Set oRange = Worksheets(«Лист1»).Range(«A1»)

А на диапазон ячеек с A1 по D10 — так:

Dim oRange As Range

Set oRange = Worksheets(«Лист1»).Range(«A1:D10»)

С применением свойства Range самого объекта Range нужно быть очень осторожным. Дело в том, что Excel создает на основе объекта Range виртуальный лист со своей собственной нумерацией. Поэтому такой код:

Set oRange1 = Worksheets(«Лист1»).Range(«C1»)

Set oRange2 = oRange1.Range(«B1»)

пропишет значение 20 не в ячейку B1, как можно было понять из кода, а в ячейку D1 (то есть B1 по отношению к виртуальному листу, начинающемуся с C1).

  • второй способ — воспользоваться свойством Cells. Возможностей у этого свойства меньше — мы можем вернуть диапазон, состоящий только из одной ячейки. Зато мы можем использовать более удобный синтаксис (с точки зрения передачи переменных, перехода в любую сторону на любое количество ячеек и т.п.). Например, для получения ссылки на ячейку D1 можно использовать код вида:

Dim oRange As Range

Set oRange = Worksheets(«Лист1»).Cells(1, 4)

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

Set oRange = Range(Cells(1, 1), Cells(5, 3))

  • третий способ — воспользоваться многочисленными свойствами объекта Range, которые позволяют изменить текущий диапазон или создать на основе его новый. Эти свойства будут рассмотрены ниже.

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

oRange.Value = «Мое значение»

Поскольку объект Range с функциональной точки зрения очень важен, то свойств и методов у него очень много (и для комфортной работы в Excel их нужно знать). Ниже представлены некоторые самые употребимые свойства:

  • Address — позволяет вернуть адрес текущего диапазона, например, для предыдущего примера вернется $A$1:$C$5. Этому свойству можно передать много параметров — для определения стиля ссылки, абсолютного или относительного адреса для столбцов и строк, по отношению к чему этот адрес будет относительным и т.п. Свойство доступно только для чтения. AddressLocal — то же самое, но с поправкой на особенности локализованных версий Excel.

На практике встречается множество ситуаций, когда адрес ячейки нужно разобрать на части и вернуть из него имя столбца или номер строки. Это очень просто сделать при помощи строковых функций — спасибо знакам доллара. Например, имя столбца для объекта oRange, представляющего одну ячейку, можно вернуть так:

sColumnName = Mid(oRange.Address, 2, (InStr(2, oRange.Address, «$») — 2))

sRowNumber = Mid(oRange.Address, (InStr(2, oRange.Address, «$») + 1))

На первый взгляд кажется сложным, но на самом деле все очень просто — для имени столбца мы просто берем все, что у нас находится между первым знаком доллара (он у нас всегда первый символ) и вторым, а для номера строки бы берем все, что у нас находится после второго знака доллара. Найти этот второй знак доллара можно при помощи встроенной функции InStr(), а взять нужное количество символов начиная с какого либо проще всего при помощи встроенной функции Mid().

  • AllowEdit — это свойство, доступное только для чтения, позволяет определить, сможет ли пользователь править данную ячейку (набор ячеек) на защищенном листе. Используется для проверок.
  • Areas — свойство исключительно важное. Дело в том, что, как уже говорилось, объект Range может состоять из несмежных наборов ячеек. Многие методы применительно к таким диапазонам ведут себя совершенно непредсказуемо или просто возвращают ошибки. Свойство Areas позволяет разбить подобные нестандартные диапазоны на набор стандартных. Созданные таким образом объекты Range будут помещены в коллекцию Areas. Это свойство можно использовать и для проверки «нестандартности» диапазона:

If Selection.Areas.Count > 1 Then

Debug.Print «Диапазон с несмежными областями»

  • Borders — возможность получить ссылку на коллекцию Borders, при помощи которой можно управлять рамками для нашего диапазона.
  • Cells — это свойство есть и для объекта Range. Работает оно точно так же, за исключением того, что опять-таки используется своя собственная виртуальная адресация на основе диапазона:

Dim oRange, oRange2 As Range

Set oRange = Range(Cells(2, 2), Cells(5, 3))

Set oRange2 = oRange.Cells(1, 1) ‘Вместо A1 получаем ссылку на B2

Debug.Print oRange2.Address ‘Так оно и есть

Точно такие же особенности у свойств Row и Rows, Column и Columns.

  • Characters — это простое с виду свойство позволяет решить непростую задачу: как изменить (текст или формат) части текста в ячейке, не затрагивая остальные данные. Например, чтобы ввести текст в ячейку A1 и изменить цвет первой буквы, можно воспользоваться кодом

Dim oRange As Range

Set oRange = Range(«A1»)

oRange.Value = «Мой текст»

oRange.Characters(1, 1).Font.Color = vbRed

Если же вам просто нужно изменить значение, то лучше воспользоваться свойством Value — как в третьей строке примера.

  • Count — возвращает количество ячеек в диапазоне. Может использоваться для проверок.
  • CurrentRegion — очень удобное свойство, которое может пригодиться, например, при копировании/экспорте данных, полученных из внешнего источника (когда сколько будет этих данных, нам изначально неизвестно). Оно возвращает объект Range, представляющий диапазон, окруженный пустыми ячейками (то есть непустую область, в которую входит исходный диапазон/ячейка). Например, чтобы выделить всю непустую область вокруг активной ячейки, можно воспользоваться кодом
  • Dependents — позволяет получить объект Range (скорее всего, включающий несмежные области) которые зависят от ячеек исходного диапазона. Работает только для текущего листа — ссылки во внешних листах этим свойством не отслеживаются. Например, чтобы выделить все ячейки, зависимые от активной, можно использовать код
  • Worksheets(«Лист1»).Activate
  • ActiveCell.Dependents.Select

Чтобы просмотреть обратную зависимость, можно использовать свойство Precedents. Чтобы просмотреть только первый уровень зависимостей, можно использовать свойства DirectDependents и DirectPrecedents.

  • End — еще одно часто используемое свойство. Оно позволяет получить объект Range, представляющий последнюю ячейку исходного диапазона. В какой стороне будет считаться последняя ячейка, можно определить при помощи передаваемого параметра.
  • Errors — свойство, которое через коллекцию Errors позволяет получить доступ к объектам Error, представляющим обнаруженные ошибки в диапазоне.
  • Font — как и в Word, это свойство позволяет получить доступ к объекту Font, при помощи которого можно настроить особенности оформления текста в ячейке (цвет, шрифт, размер букв и т.п.)
  • FormatConditions — возможность создать собственный объект, представляющий вариант оформления ячеек, который затем можно применять к разным ячейкам и диапазонам.
  • Formula — одно из самых важных свойств объекта Range. Доступно и на чтение, и на запись. Если используется на чтение, то возвращает текст формулы, прописанной в ячейку (а не вычисленное значение), если используется на запись, то позволяет записать формулу в ячейку. Если применить это свойство для диапазона, в который входит несколько ячеек, то формула будет прописана по все ячейки диапазона. Пример применения этого свойства может выглядеть так:
  • Свойство FormulaLocal, как и AddressLocal, позволяет внести поправки на особенности нумерации ячеек в локализованной версии Excel (для русских версий Excel в нем нет необходимости).
  • FormulaHidden — возможность спрятать формулы в диапазоне от пользователя. Работает только на защищенных листах.
  • HasFormula — проверить диапазон на наличие вычисляемых значений (формул).
  • Hidden — спрятать диапазон. Будет работать только в случае, если диапазон включает в себя хотя бы одну строку или столбец целиком, в противном случае вернется ошибка.
  • Interior — еще одно свойство, связанное с форматированием. В основном позволяет покрасить ячейки диапазона.
  • Item — позволяет получить еще один объект Range, который определяется путем смещения исходного диапазона.
  • Locked — это свойство позволяет заблокировать ячейки диапазона при защите листа.
  • Name — возможность получить ссылку на специальный объект именованного диапазона Name. На графическом экране с его возможностями можно познакомиться при помощи меню Вставка ->Имя. Он позволяет обращаться к диапазонам и формулам по именам и несколько напоминает по функциональности объект закладки в Word.
  • Next — перейти на следующую ячейку. Если лист не защищен, то следующей ячейкой будет считаться ячейка справа, если защищен — то следующая незаблокированная ячейка.
  • NumberFormat — возможность установить один из предопределенных форматов для чисел. Соответствует возможностям вкладки Число в меню Формат ->Ячейки на графическом экране.
  • Offset — это свойство позволяет получить новый объект Range с определенным смещением от исходного. Например, чтобы получить ячейку со смещением на три ячейки вверх от сходной и три ячейки влево, можно использовать код
  • свойство Orientation позволяет сориентировать текст в ячейках. Указывается угол наклона в градусах. Например, чтобы расположить текст по диагонали, можно использовать код
  • PageBreak — это свойство обычно используется для программной вставки разрывов страницы. Его применение может выглядеть так:
  • все свойства, которые начинаются на Pivot…, относятся к работе с объектом PivotTable (сводная таблица). Особенности работы с ней будут рассмотрены ниже.
  • QueryTable — это очень важное свойство позволяет получить ссылку на объект QueryTable — полученные с внешнего источника данные. Это свойство для объекта Range позволяет получить ссылку на объект QueryTable, которые находится в данном диапазоне. Подробнее про объект QueryTable будет рассказано ниже.
  • Range — это свойство, как уже говорилось выше, позволяет создать новый диапазон на основе уже существующего. Необходимо помнить про особенности нумерации ячеек в этом случае.
  • Resize — возможность изменить текущий диапазон. Например, увеличение его на один столбец вниз и одну строку вправо может выглядеть так:

oRange.Resize(oRange.Rows.Count + 1, oRange.Columns.Count + 1).Select

  • ShrinkToFit — это свойство позволяет автоматически настроить размер текста в диапазоне таким образом, чтобы текст умещался в ширину столбца.
  • Style — это свойство позволяет вернуть объект Style, представляющий стиль для указанного диапазона. На графическом экране то, что позволяет сделать объект Style, можно сделать через меню Формат ->Стиль.
  • Text — возможность получить значение первой ячейки диапазона в виде значения типа String. Для объекта Range это свойство доступно только для чтения.
  • Validation — это свойство позволяет вернуть объект Validation, при помощи которого можно настроить проверку вводимых в диапазон данных.
  • Value — наиболее часто используемое свойство объекта Range. Позволяет получить или назначить значение (числовое, текстовое или какое-либо другое) ячейкам диапазона. Точно для той же цели используется свойство Value2, единственное отличие — это свойство не поддерживает типы данных Currency и Date.
  • WrapText — возможность включить/отключить перевод текста на следующую строку в ячейках диапазона.

Теперь — о методах объекта Range:

  • Activate() — выделяет текущий диапазон и устанавливает курсор ввода на его первую ячейку.
  • AddComment() — возможность добавить комментарий к ячейке. Ячейка будет помечена красным уголком, а текст комментария будет показан в виде всплывающей подсказки. Этот метод можно вызвать только для диапазона, состоящего из одной ячейки. То же самое на графическом экране можно сделать при помощи меню Вставка ->Примечание.
  • AutoFill() — возможность использовать автозаполнение для диапазона (например, если первые две ячейки будут заполнены как 1 и 2, то дальше в автоматическом режиме будет продолжено: 3, 4, 5 и т.п.)
  • AutoFit() — автоматически поменять ширину всех столбцов и высоту всех строк в диапазоне, чтобы туда уместился текст ячеек. Можно применять только к тем диапазонам, которые состоят из набора столбцов (полностью) или набора ячеек (также полностью), иначе будет ошибка.
  • AutoFormat() — возможности использовать один из стилей автоформатирования (то, что на графическом экране доступно через меню Формат ->Автоформат).
  • BorderAround() — возможность поместить диапазон в рамку с выбранными вами параметрами.
  • методы Clear… позволяют очистить содержимое диапазона — от значений, форматирования, комментарий и т.п.
  • Consolidate() — возможность слить данные нескольких диапазонов (в том числе на разных листах) в один диапазон, используя при этом выбранную вами агрегатную функцию.
  • Copy() — возможность скопировать диапазон в другое место. Если место назначения не указано, он копируется в буфер обмена. Аналогично работает метод Cut(), при котором данные исходного диапазона вырезаются.
  • CopyFromRecordset() — очень удобный метод, который позволяет вставить данные из объекта ADO Recordset на лист Excel, начиная с верхнего левого угла указанного диапазона.
  • DataSeries() — метод, который может сэкономить множество времени и избежать возни с функциями даты и времени. Этот метод позволяет увеличить вами значения даты в диапазоне на указанный вами временной интервал. Например, если у вас в диапазоне стоит первое января, то при помощи этого метода можно сгенерировать первое число любого другого месяца.
  • Delete() — удаляет данные текущего диапазона. В качестве необязательно параметра можно определить, с какой стороны будут сдвигаться ячейки на место удаленных.
  • Dirty() — пометить ячейки диапазона как «грязные». Такие ячейки будут пересчитаны при следующем же пересчете. Обычно используется, когда Word сам не может догадаться, что их нужно пересчитать. Пересчитать ячейки диапазона можно и принудительно — при помощи метода Calculate().
  • методы Fill… (FillDown(), FillUp(), FillLeft(), FillRight()) позволяют размножить одно и то же значение по ячейкам диапазона в указанном вами направлении.
  • метод Find() позволяет произвести поиск по ячейкам диапазона и вернуть новый объект Range, который представляет первую ячейку, в котором было найдено нужное значение. У этого метода есть множество необязательных параметров, которые позволяют определить направление поиска, чувствительность к регистру, искать все значение ячейки или часть и т.п. Методы FindNext() и FindPrevious() позволяют продолжить поиск, начатый методом Find(), в разных направлениях.
  • метод GoalSeek() позволяет применить автоподбор значений для функции Excel программным способом. На графическом экране то же самое можно сделать при помощи меню Сервис ->Подбор параметра.
  • метод Insert() позволяет вставить ячейки в диапазон, сдвинув остальные (вы можете выбрать — вправо или вниз).
  • метод Justify() позволяет равномерно распределить текст по диапазону. Если в данный диапазон он не помещается, он будет распространен на соседние ячейки (с перезаписью их значений).
  • метод Merge() позволяет слить все ячейки диапазона в одну. При этом останется только одно значение — верхней левой ячейки. Разбить обратно такую слитую ячейку на несколько обычных можно при помощи метода UnMerge().
  • Parse() — позволяет разбить одну ячейку на несколько по указанному вами шаблону (например, чтобы отделить код города от номера телефона).
  • PasteSpecial() — операция, дополняющая Copy() и Cut(). Она позволяет вставить то, что лежит в буфере обмена, с указанием специальных параметров вставки (вставлять с добавлением к существующим данным, с умножением, вычитанием, делением и т.п.)
  • PrintOut() и PrintPreview() — позволяют вывести диапазон на печать или открыть режим просмотра перед печатью..
  • Replace() — метод, дополняющий метод Find(). Позволяет проводить поиск и замену значений в диапазоне.
  • Select() — возможность выделить указанный диапазон. Объекта Selection в Excel нет — вместо него есть возможность получить объект Range, представляющий выделенную область.
  • Show() — экран будет проскроллирован таким образом, чтобы показать указанный диапазон.
  • ShowDependents() — показать стрелки для ячеек, которые зависят от указанного диапазона (только первый уровень зависимости) или эти стрелки убрать. Обратный метод — ShowPrecedents().
  • ShowErrors() — показать источник ошибки для указанной ячейки.
  • Sort() — возможность произвести сортировку ячеек в диапазоне. Можно использовать большое количество необязательных параметров для настройки сортировки. SortSpecial() — с учетом особенностей азиатских языков.
  • Speak() — удивительный метод, который позволяет зачитывать вслух содержимое диапазона (можно определить, в каком направлении и будут ли зачитываться формулы). К сожалению, в локализованной версии Excel не работает.
  • SpecialCells() — очень удобный метод, который позволяет вернуть объект Range, включающий в себя все ячейки определенного типа (пустые, с ошибками, с комментариями, последние, с константами, с формулами, с определенным форматированием) и с определенным значением. Например, чтобы вернуть объект Range, состоящий из всех пустых ячеек диапазона, можно использовать код

Set oRange2 = oRange.SpecialCells(xlCellTypeBlanks)

oRange 2. Select ‘проверяем, так ли это

  • метод SubTotal() позволяет посчитать итоговое значение для диапазона (можно выбрать агрегатную функцию и множество других параметров).
  • метод Table() позволяет создать таблицу на основе передаваемого столбца, строки и функции, которую нужно использовать для вычисления ячеек таблицы. Пример из документации по этому методу позволяет автоматически сгенерировать таблицу умножения.
  • TextToColumns() — сложный метод, который позволяет разбить столбцы в диапазоне на несколько столбцов в соответствии с определенным алгоритмом. Принимает множество необязательных параметров.

Источник

2 / 2 / 2

Регистрация: 28.09.2015

Сообщений: 258

1

Скопировать значения ячеек, ориентируясь по соседней ячейке

18.01.2016, 09:01. Показов 8900. Ответов 7


Студворк — интернет-сервис помощи студентам

Здравствуйте, подскажите, пожалуйста как можно сделать такую манипуляцию:

Необходимо скопировать значение ячеек в столбце I, ориентируясь по столбцу K. Конкретно нужно найти самую нижнюю заполненную ячейку в столбце K, и со следующей строки скопировать все значения в столбце I до самой последней заполненной ячейки. (пример: в столбце I последняя заполненная ячейка в 100 строке, а в столбце K последняя заполненная ячейка в 74 строке.. в этом случае нужно скопировать значения в столбце I с 75 по 100 строку.
Далее вставить скопированные значения нужно в столбец B, после самой последней заполненной строки.



0



Kubuntovod

Эксперт NIX

2670 / 786 / 176

Регистрация: 14.01.2013

Сообщений: 3,672

18.01.2016, 09:05

2

Последняя заполненная строка второго столбца:

Visual Basic
1
Cells(Rows.Count, 2).End(xlUp).Row

Остальное достаточно просто.



1



2 / 2 / 2

Регистрация: 28.09.2015

Сообщений: 258

18.01.2016, 11:51

 [ТС]

3

Цитата
Сообщение от Kubuntovod
Посмотреть сообщение

Остальное достаточно просто.

Мне все не просто



0



Аксима

6076 / 1320 / 195

Регистрация: 12.12.2012

Сообщений: 1,023

18.01.2016, 12:19

4

Здравствуйте, AlexanderSh88,

Модифицировал код от Kubuntovod таким образом, чтобы вместо непонятной двойки можно было использовать имя столбца, и чтобы искалась не последняя строка, а строка после последней. В остальном он прав — задача действительно не очень сложна.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
'Функция находит номер строки, следующей за последней строкой столбца с именем columnName.
Function LastRow(ByVal columnName As String) As Long
    LastRow = Cells(Rows.Count, Asc(columnName) - 64).End(xlUp).Row + 1
End Function
'Процедура производит копирование данных из ячеек столбца I, находящихся в строках после
'последней заполненной строки в столбце K и до строки после последней заполненной строки
'в столбце I (т.е. вместе с данными копируется одна пустая ячейка, но это не страшно).
'Копирование производится в столбец B после последней заполненной строки.
Sub Copy_I_By_K()
    Range("I" & LastRow("K") & ":I" & LastRow("I")).Copy Range("B" & LastRow("B"))
End Sub

С уважением,

Аксима



1



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

18.01.2016, 12:44

5

Можно две операции убрать:

Visual Basic
1
LastRow = Range(columnName & Rows.Count).End(xlUp).Row + 1

Но вообще нужно бы ещё уточнять чьи Rows считаем…



2



AlexanderSh88

2 / 2 / 2

Регистрация: 28.09.2015

Сообщений: 258

18.01.2016, 14:18

 [ТС]

6

Спасибо всем за ответы

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
'Функция находит номер строки, следующей за последней строкой столбца с именем columnName.
Function LastRow(ByVal columnName As String) As Long
    LastRow = Cells(Rows.Count, Asc(columnName) - 64).End(xlUp).Row + 1
End Function
'Процедура производит копирование данных из ячеек столбца I, находящихся в строках после
'последней заполненной строки в столбце K и до строки после последней заполненной строки
'в столбце I (т.е. вместе с данными копируется одна пустая ячейка, но это не страшно).
'Копирование производится в столбец B после последней заполненной строки.
Sub Copy_I_By_K()
    Range("I" & LastRow("K") & ":I" & LastRow("I")).Copy Range("B" & LastRow("B"))
End Sub

Здравствуйте.
попробовал применить код.. у меня получилось, что заголовок таблицы столбца I с копировался в заголовок таблицы столбца B
Наверно что то не то сделал опять((
В примере самая последняя строка в столбце K номер 15, значит с копироваться должны значения в столбце I, начиная с 16 строки, до самой нижней заполненной (т.е. это две семерки) и они должны вставится в ячейки B19 и B20.
Забыл еще одну вещь.. можно ли рядом с каждым вставленным значением слева (в столбце А) вставить значение 30?.

Вложения

Тип файла: rar Отчеты.rar (78.6 Кб, 27 просмотров)



0



Аксима

6076 / 1320 / 195

Регистрация: 12.12.2012

Сообщений: 1,023

18.01.2016, 18:03

7

Лучший ответ Сообщение было отмечено AlexanderSh88 как решение

Решение

AlexanderSh88, скорректировал программу с учетом того, что работа производится с «умной таблицей», а не просто на листе, а также с учетом пожелания по добавлению значений (30) рядом со скопированными значениями.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Dim tbl As ListObject
'Функция возвращает номер столбца листа Excel по имени столбца "умной таблицы" tblColumn.
Function SheetColumn(ByVal tblColumn As String) As Long
    SheetColumn = tbl.ListColumns(tblColumn).Range.Column
End Function
'Функция находит номер последней заполненной строки столбца "умной таблицы" с именем tblColumn.
Function LastRow(ByVal tblColumn As String) As Long
    Dim rng As Range
    Set rng = tbl.ListColumns(tblColumn).DataBodyRange.Cells(tbl.ListRows.Count)
    If IsEmpty(rng.Value) Then Set rng = rng.End(xlUp)
    LastRow = rng.Row
End Function
'Процедура копирования по замысловатым условиям.
Sub Copy2()
    Dim wsh As Worksheet, a&, b&, c&, d&, e&, f&, g&
    Set wsh = Sheets("Быстрый расчет")
    Set tbl = wsh.ListObjects(1)
    a = LastRow("Всего -")
    b = LastRow("Вес -")
    If b > a Then
        c = LastRow("Вес +") + 1
        d = LastRow("Цена +") + 1
        e = SheetColumn("Вес -")
        f = SheetColumn("Вес +")
        g = SheetColumn("Цена +")
        wsh.Range(wsh.Cells(a + 1, e), wsh.Cells(b, e)).Copy wsh.Cells(c, f)
        wsh.Range(wsh.Cells(d, g), wsh.Cells(c + b - a - 1, g)).Value = 30
    End If
    Set tbl = Nothing
End Sub

С уважением,

Аксима

Добавлено через 2 минуты

Цитата
Сообщение от Аксима
Посмотреть сообщение

задача действительно не очень сложна.

Что-то поторопился с этим утверждением



1



2 / 2 / 2

Регистрация: 28.09.2015

Сообщений: 258

18.01.2016, 18:58

 [ТС]

8

спасибо, теперь все работает как мечталось



0



 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

Добрый день!

Есть таблица со значениями, расположенными по листу в нескольких парах столбцов (так сложилось — необходимо уменьшить печатаемую область). Каждому текстовому значение соответствует число в ячейке справа. Необходимо найти текстовое значение и вернуть число из ячейки справа в таблице, состоящих из нескольких столбцов и строк.

В принципе пока что решаю это несколькими вложенными ЕСЛИОШИБКА с ВПР внутри для каждой пары столбцов, но хотелось бы знать, есть ли функция, которая способна искать значение внутри таблицы из многих строк и столбцов и возвращать значение со смещением (типа ВПР только не по одному столбцу — первому, а в любом выбранном диапазоне строк и столбцов)

Пример во вложении.

Спасибо вам за помощь!

Прикрепленные файлы

  • Книга1.xlsx (10.12 КБ)

Изменено: thalamix24.04.2013 18:40:04

 

Михаил С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#2

24.04.2013 15:22:43

Если все значения уникальны, можно так

Код
=ИНДЕКС(A1:F5;СУММПРОИЗВ(СТРОКА(A1:F5)*(A1:F5=A9));СУММПРОИЗВ(СТОЛБЕЦ(A1:F5)*(A1:F5=A9))+1)
 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

#3

24.04.2013 15:32:55

Спасибо!

Правильно ли я понимаю, что отдельной функции поиска определенного значения в произвольной таблице нет, и по любому придется комбинировать несколько функций?

Иначе будь такая функция, назовем ее ХПОИСК, то выглядело бы как-то так

Код
=ИНДЕКС(таблица; ХПОИСК(номер_строки; номер_столбца+1)

Эх, мечты, мечты  :D  Вообще странно, что нету функции произвольного поиска, у меня Ctrl+F без продыху пашет.

 

функции листа нет. В VBA есть Find.

 

МашА

Пользователь

Сообщений: 30
Регистрация: 10.01.2013

Макрос пойдет?

См приложение.

Прикрепленные файлы

  • Книга1.xlsm (17.85 КБ)

 

С.М.

Пользователь

Сообщений: 936
Регистрация: 22.12.2012

#6

24.04.2013 15:41:19

Цитата
…странно, что нету функции произвольного поиска

Есть, но доморощенная (UDF)

Прикрепленные файлы

  • Поиск значения в таблице.xls (42.5 КБ)

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

=МАКС(ЕСЛИ(A9=A1:F5;B1:G5))

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

МашА, спасибо за макрос! Но в связи с поголовной боязнью (включая меня ^^) макросов пользуемся только встроенными функциями, макросы живут только во время одной сессии и не сохраняются, в основном для уменьшения рутины: выполнения группы однообразных операций с данными листа.

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

#9

24.04.2013 16:21:59

Цитата
С.М. пишет:
Есть, но доморощенная (UDF)

У меня =ВПРП(A9;$A$1:$F$5) не сработало — пишет #ИМЯ? (версия программы 2007 сервис пак 1)Ввел вручную — сработало! Что за функция ВПРП? Гугл не в курсе вроде.

Разобрался — это

макрос

функция, определяемая пользователем :) К сожалению не подходит, т.к. пользователь не только я, и необходимо пользоваться только встроенными стандартными функциями.

Изменено: thalamix25.04.2013 08:43:41
(Разобрался с UDF)

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Почему Владимира игнорируете? Идеальный вариант — только нужно вводить как формулу массива.

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

Вариант Владимира сработал при Ctrl+Shift+Enter. Очень интересное для меня решение. Причем вот так ЕСЛИ(A9=A1:F5;B1:G5) возвращает ЛОЖЬ.

Объясните дундуку, как это колдунство работает, и почему МАКС?

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Пока Владимира нет — оно возвращает массив, поэтому без МАКС видите только одно первое значение.
А с МАКС выбранное.

Можно вместо MAX писать MIN или AVERAGE — смотря по задаче :)

Изменено: Hugo24.04.2013 16:31:27

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

#13

24.04.2013 16:28:55

Цитата
Hugo пишет:
Почему Владимира игнорируете? Идеальный вариант — только нужно вводить как формулу массива.

Ничуть не игнорирую — просто отвечал в хронологическом порядке. Согласен с вами, формула весьма простая и работает. Только как, мне не понятно? О_о

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

#14

24.04.2013 16:30:30

Цитата
.. без МАКС видите только одно первое значение.

А ЕСЛИ не понимает {} ?

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Принимает ЕСЛИ массив — введите ЕСЛИ(A9=A1:F5;B1:G5)  сразу в диапазон 5х6 — увидите кучу ЛОЖЬ и одно число 31.

Изменено: Hugo24.04.2013 16:33:43

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

Прошу прощения за свою тупость — как понять «диапазон 5х6»?

Догнал, ввести = протянуть формулу на 6 столбцов и 5 строк, поставив вместо А9  — $A$9.

Как я это понимаю — приведенная Владимиром функция вычисляет максимум из массива, подходящему согласно условия в ЕСЛИ, то есть максимум из одного числа. По логике

строителя коммунизма

если одно число, зачем ему искать максимум из себя, и должно бы сработать и без МАКС,

…а не работает. Вот до чего мой ограниченный разум не доходит.  :)

Изменено: thalamix24.04.2013 16:40:27
(Сам допер :) )

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Про 5х6 — нужно немного иначе делать — выделяем диапазон размером с Ваши данные, затем В СТРОКЕ ФОРМУЛ пишем =ЕСЛИ(A9=A1:F5;B1:G5) Ctrl+Shift+Enter
Получаем массив значений, из которого и выбирает нужное МАКС().
Только она выбирает не из диапазона, а из виртуального массива, который возвращает ЕСЛИ().

Изменено: Hugo24.04.2013 16:47:03

 

thalamix

Пользователь

Сообщений: 10
Регистрация: 24.04.2013

#18

24.04.2013 16:47:43

Цитата
Hugo пишет:
Про 5х6 — нужно немного иначе делать

Сработало аналогично. Я так понял МАКС это делает виртуально. Надо будет запомнить.

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

Всем спасибо еще раз!

 

Владимир, добрый день!
Подскажите пожалуйста, как должна выглядеть формула, если требуется суммировать несколько таких значений из диапазона ячеек.

Сама задача: на одном листе Excel есть повторяющиеся по структуре таблицы (ежегодный бюджет). Необходимо вычислить среднее значение за несколько лет, суммировав значения по месяцам. Ячейка с названием расположена слева от ячейки со значением.
Т.е. в первом месяце ячейка с названием A1, а значение в ячейке B1. Ячейка C1 пустая, а потом снова ячейка с названием D1, а значение в ячейке E1. И так 12 раз в году. 3 года.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#20

08.10.2019 21:57:46

Вопрос не по теме

Понравилась статья? Поделить с друзьями:
  • Excel vba значение всего столбца
  • Excel vba значение в списке
  • Excel vba защищенный просмотр
  • Excel vba защищенный лист
  • Excel vba защита листа от изменения