Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 41
1

Как применить определенные свойства (в том числе объединение) ко всем выделенным ячейкам?

12.08.2014, 19:55. Показов 2161. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Пытаюсь научиться банальным операциям в VBA. Спорным, которые так просто в гугле не найти. Хотя бы потому что не знаю какой запрос написать.
В общем, хочу написать что-то типа офисной программы на базе Excel. Для работы. Именно самостоятельно разобраться и написать. В окружении знакомых нет программеров. По мере работы буду задавать вопросы, в надежде вашей поддержки.
Итак, первый вопрос, который не знаю как загуглить:
Хочу выделить сразу по несколько ячеек, чтобы объединить их именно определенным образом и применить к ним определённые параметры (границы, шрифт и т.д.). Простейший код Range("A9:A10, B9:B10, A11:B11").Select c этим справляется, но я не могу понять как это сделать относительно ActiveCell.
Вот отрывок кода, где я хочу определённые ячейки заменить на относительные:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Range("A9:A10, B9:B10, A11:B11").Select
    With Selection
        .MergeCells = True
    End With
    With Selection.Font
        .Name = "Times New Roman"
        .Size = 12
    End With
    With Selection.Borders
    .LineStyle = xlContinuous
    End With
    ActiveCell.FormulaR1C1 = "Дата"
    ActiveCell.Offset(0, 1).Select
    ActiveCell.FormulaR1C1 = Date
    ActiveCell.Offset(1, 0).Select
    ActiveCell.FormulaR1C1 = "Подпись"
Ячеек много и они по-разному объединяются. По отдельности, конечно, можно двигаться и присваивать каждой ячейке нужные значения, но это код растёт в разы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2014, 19:55
Ответы с готовыми решениями:

Прибавить ко всем выделенным ячейкам число
Подскажите пожалуйста как ко всем выделенным ячейкам прибавить число?

Как в запросе на объединение применить WHERE сразу ко всем объединяемым таблицам?
Здравствуйте! В БД есть "Запрос" (на объединение), в котором желаемый результат. Если записей...

Псевдокласс :not - как применить css-свойства ко всем элементам, кроме первого
Добрый день. Подскажите, пожалуйста, как можно применить css-свойства ко всем элементам, кроме...

Отправка сообщений всем пользователям, и ОТКЛЮЧЕННЫМ в том числе
Необходимо отправлять сообщение на терминальном сервере ВСЕМ пользователям. Команда msg * "Текст...

7
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
13.08.2014, 11:33 2
Здравствуйте, CrazyTonik,
Не уверен на 100%, что правильно понял вашу проблему, но предложу переработать код так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub FillCellsUnion()
    Dim i As Long, arr As Variant, rng As Range
    'Óêàçûâàåì ÿ÷åéêè, ñ êîòîðûìè ìû õîòèì ðàáîòàòü.
    Set rng = Range("A9:A10, B9:B10, A11:B11")
    'Ôîðìàòèðóåì ýòè ÿ÷åéêè.
    With rng
        With .Font
            .Name = "Times New Roman"
            .Size = 12
        End With
        .Borders.LineStyle = xlContinuous
        .MergeCells = True
    End With
    'Óêàçûâàåì çíà÷åíèÿ, êîòîðûìè äîëæíû áûòü çàïîëíåíû ÿ÷åéêè.
    arr = Array("Äàòà", Date, "Ïîäïèñü")
    'Çàïîëíÿåì ÿ÷åéêè çíà÷åíèÿìè. Äëÿ îáðàùåíèÿ ê êàæäîé ãðóïïå
    'объединенных ÿ÷ååê èñïîëüçóåì ñâîéñòâî .Areas
    For Each rng In rng.Areas
        rng.Cells(1) = arr(i)
        i = i + 1
    Next rng
End Sub
С уважением,
Aksima
0
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 41
13.08.2014, 21:31  [ТС] 3
Спасибо, но немного не то что я хочу. Это будет шапка таблицы. И создаваться она будет запуском макроса. И не фиксированно в определённом месте, а там, где я выделю ячейку. Грубо говоря, я хочу сократить код
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
Range(ActiveCell, ActiveCell(1, 2)).Select
    With Selection
        .HorizontalAlignment = xlLeft
        .MergeCells = True
    End With
    With Selection.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With
    With Selection.Font
        .Name = "Times New Roman"
        .Size = 12
    End With
    ActiveCell.FormulaR1C1 = "Äàòà"
    'Range("A2:B2").Select
    ActiveCell.Offset(1, 0).Select
    Range(ActiveCell, ActiveCell(1, 2)).Select
    With Selection
        .HorizontalAlignment = xlLeft
        .MergeCells = True
    End With
    With Selection.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
    End With
    With Selection.Font
        .Name = "Times New Roman"
        .Size = 12
    End With
    ActiveCell.FormulaR1C1 = Date
И так далее в хаотичном порядке штук 10 ячеек. А свойства одинаковые. Поэтому я хочу выделить сразу несколько ячеек в хаотичном порядке и применить один раз все эти свойства.
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
13.08.2014, 21:56 4
CrazyTonik, тогда так:
  1. Выделяете все 10 ячеек.
  2. Запускаете следующую программу:
    Visual Basic
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    Sub FillFormatCellsUnion()
        Dim i As Long, arr As Variant, rng As Range
        'Óêàçûâàåì çíà÷åíèÿ, êîòîðûìè äîëæíû áûòü çàïîëíåíû ÿ÷åéêè.
        arr = Array("Äàòà", Date, "Ïîäïèñü")
        'Ôîðìàòèðóåì ÿ÷åéêè è çàïîëíÿåì èõ çíà÷åíèÿìè.
        'Äëÿ îáðàùåíèÿ ê êàæäîé ãðóïïå îáúåäèíåííûõ
        'ÿ÷ååê èñïîëüçóåì ñâîéñòâî .Areas
        For Each rng In Selection.Areas
            With rng
                .Font.Name = "Times New Roman"
                .Font.Size = 12
                .Borders.LineStyle = xlContinuous
                .MergeCells = True
                If i <= UBound(arr) Then .Cells(1) = arr(i)
                i = i + 1
            End With
        Next rng
    End Sub
  3. Получаете результат.
  4. Докладываете, насколько мне удалось приблизиться к вашему пониманию задачи.

С уважением,
Aksima
0
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 41
13.08.2014, 23:38  [ТС] 5
Опять немного не то (хотя, код себе сохраню). Сейчас меня интересует как выделить одновременно несколько групп ячеек. Например, когда выделение идёт с зажатием кнопки Ctrl. Т.е. выделяются группы ячеек. Я не знаю как мне заменить строку, в которой выделяются определённые ячейки с координатами (Range("A9:A10, B9:B10, A11:B11")) на строку, в которой идёт выделение относительно выделенной ячейки. Обратите внимание на мой первый код в теме. Там выделяются одной строкой шесть ячеек и объединяются по две в заданном порядке. Но это ячейки с фиксированными координатами. А как мне прописать Range относительно ActiveCell?
0
Заблокирован
14.08.2014, 09:20 6
Цитата Сообщение от CrazyTonik Посмотреть сообщение
как мне прописать Range относительно ActiveCell?
Visual Basic
1
2
3
With ActiveCell
  Union(.Offset(3, 2), Range(.Offset(5, 3), .Offset(7, 8))).Select
End With
А вот зачем нужен Select и нужен ли вообще - Выделить несмежные ячейки с помощью Union() ?
0
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 41
14.08.2014, 11:17  [ТС] 7
Вот это уже ближе) Но опять небольшая заминка. Например:
Visual Basic
1
2
3
Union(Range(.Offset(0, 0), .Offset(0, 1)), _
        Range(.Offset(1, 0), .Offset(1, 1)), _
        Range(.Offset(2, 0), .Offset(2, 1)).Select
Выделяются не отдельно 6 ячеек по 2, чтобы объединиться в 3 широких, а выделяются сразу 6 ячеек и объединяются в одну.
0
0 / 0 / 0
Регистрация: 10.07.2014
Сообщений: 41
18.08.2014, 12:02  [ТС] 8
Вобщем, решил я сделать вот так:
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
31
32
33
34
35
36
37
38
With ActiveCell
  Union(Range(.Offset(0, 0), .Offset(0, 1)), _
        Range(.Offset(2, 0), .Offset(2, 1)), _
        Range(.Offset(4, 0), .Offset(4, 1)), _
        Range(.Offset(0, 2), .Offset(1, 5)), _
        Range(.Offset(3, 2), .Offset(3, 3)), _
        Range(.Offset(4, 4), .Offset(4, 9)), _
        Range(.Offset(0, 6), .Offset(0, 7)), _
        Range(.Offset(1, 8), .Offset(1, 10)), _
        Range(.Offset(3, 10), .Offset(3, 11)), _
        Range(.Offset(2, 8), .Offset(2, 12)), _
        Range(.Offset(5, 1), .Offset(5, 2)), _
        Range(.Offset(5, 7), .Offset(5, 8))).Select
End With
    With Selection.Merge
    End With
ActiveCell.Offset(1, 0).Select
With ActiveCell
  Union(Range(.Offset(0, 0), .Offset(0, 1)), _
        Range(.Offset(0, 6), .Offset(0, 7)), _
        Range(.Offset(2, 0), .Offset(2, 1)), _
        Range(.Offset(1, 2), .Offset(1, 7)), _
        Range(.Offset(3, 2), .Offset(3, 3)), _
        Range(.Offset(2, 4), .Offset(2, 9)), _
        Range(.Offset(3, 10), .Offset(3, 11)), _
        Range(.Offset(-1, 8), .Offset(-1, 10)), _
        Range(.Offset(4, 3), .Offset(4, 5)), _
        Range(.Offset(4, 9), .Offset(4, 10))).Select
End With
With Selection.Merge
End With
ActiveCell.Offset(-1, 0).Select
Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(5, 11)).Select
With Selection.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
End With
Вот так изначально должны быть разбиты ячейки.
Далее в некоторые ячейки я вписываю данные. Шагаю по ним Offset-ом.
0
18.08.2014, 12:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2014, 12:02
Помогаю со студенческими работами здесь

Цикл по выделенным ячейкам DataGrid
foreach(var a in cdgTICKERS.SelectedItems) MessageBox.Show(a.ToString()); ...

Доступ к выделенным ячейкам Excel
Добрый день. Прошу помогите. Знаю способ чтения данных из выделенных ячеек Excel: ...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru