Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить размеры объединенной ячейки 
V
    Опции темы
Colloseum
Дата 7.7.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



У меня ряд объединенных ячеек (по 6-ть штук, но это не обязятельно) с датами.
В этом дипазоне нахожу нужную по заданной дате, как узнать (ширину или адрес) этой ячейки. Это необходимо чтоб опустится на уровень ниже и обработать уже этот узкий диапазон.

PM MAIL   Вверх
LOPUH
Дата 8.7.2008, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Растение
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 15.2.2008
Где: Красноярск

Репутация: 3
Всего: 4



Цитата(Colloseum @  8.7.2008,  01:14 Найти цитируемый пост)
 Определить размеры объединенной ячейки 


Цитата(Colloseum @  8.7.2008,  01:14 Найти цитируемый пост)
как узнать (ширину или адрес) этой ячейки

Так что вам вам все таки нужно?   Ладно опробую ответить на несколько вопросов, хотя это не в правилах форума..
Код

Option Explicit
Sub demo()


Dim rCount, cCount As Integer
Dim rng As Range
 

Set rng = Range("A1 :D4")
rCount = rng.Rows.Count                'количество строк в объединении
cCount = rng.Columns.Count             'количество столбцов в объединении

MsgBox rng.Address(RowAbsolute:=False) 'aбсолютный адрес объединения


'относительный адрес, задан относительно ячейки "С3"
MsgBox rng.Address(ReferenceStyle:=xlR1C1, _
    RowAbsolute:=False, _
    ColumnAbsolute:=False, _
    RelativeTo:=Worksheets(1).Cells(3, 3))
    
End Sub

 

Цитата(Colloseum @  8.7.2008,  01:14 Найти цитируемый пост)
Это необходимо чтоб опустится на уровень ниже и обработать уже этот узкий диапазон.

Для этого вам скорее всего понадобится свойство .Offset
Код

Range("C3").Activate
    For i = -2 To 1
        ActiveCell.Offset(1, i).Interior.ColorIndex =4'закрашивает ячейки строчкой ниже
    Next


Это сообщение отредактировал(а) LOPUH - 8.7.2008, 05:36
PM MAIL   Вверх
Colloseum
Дата 8.7.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



2 LOPUH спасибо за ответ но немного не то (сам виноват, не внятно спросил).
Я чесно говоря не различаю понятия, для меня к примеру если объединить ячейки В2:D2 то это и адрес и размер. smile 

Это необходимо для того чтоб более гибко переписать код.

Пиведу код уже написанной процедуры.
Код

Function ВЫБОРИЗ(ValRange As Range, ValKey As String, KeyDate As Date, PeriodRange As Range, SelValue As String, SelSubValue As String) As Variant
    'ВЫБОРИЗ = "-"
    For x = 1 To PeriodRange.Rows.Count
        For y = 1 To PeriodRange.Columns.Count
            If (month(PeriodRange(x, y)) = month(KeyDate)) Then
                If (PeriodRange(x + 1, y) = SelValue) Then
                    If (PeriodRange(x + 2, y) = SelSubValue) Then
                        ВЫБОРИЗ = PeriodRange(GetRowNumber(ValRange, ValKey), y)
                    End If
                    If (PeriodRange(x + 2, y + 1) = SelSubValue) Then
                        ВЫБОРИЗ = PeriodRange(GetRowNumber(ValRange, ValKey), y + 1)
                    End If
                End If
                If (PeriodRange(x + 1, y + 2) = SelValue) Then
                    If (PeriodRange(x + 2, y + 2) = SelSubValue) Then
                        ВЫБОРИЗ = PeriodRange(GetRowNumber(ValRange, ValKey), y + 2)
                    End If
                    If (PeriodRange(x + 2, y + 3) = SelSubValue) Then
                        ВЫБОРИЗ = PeriodRange(GetRowNumber(ValRange, ValKey), y + 3)
                    End If
                End If
            End If
        Next y
    Next x
    If (ВЫБОРИЗ = 0) Then
        ВЫБОРИЗ = "-"
    End If
End Function

'Получить номер строки из выделенного диапазона ячеек по ключу
Function GetRowNumber(ValRange As Range, ValKey As String) As Integer
    For x = 1 To ValRange.Rows.Count
        For y = 1 To ValRange.Columns.Count
            If (ValRange(x, y) = ValKey) Then
                GetRowNumber = ValRange.Row + x - 1
            End If
        Next y
    Next x
End Function


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  ____.rar 22,70 Kb
PM MAIL   Вверх
LOPUH
Дата 8.7.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Растение
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 15.2.2008
Где: Красноярск

Репутация: 3
Всего: 4



Т.е процедура (кстати , не процедура , а функция)  у вас написана, работает нормально, но вы хотите оптимизировать код?
  
PM MAIL   Вверх
Colloseum
Дата 8.7.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



Да, но в нее жестко зашито как обрабатывать диапазон, и как следствие работает только для четырех столбиков или меньше.
А вот если мне найдя нужную ячейку определить ширину ее, то я б обрабатывал любое кол-во ячеек под ней.
И оно было бы гораздо универсальнее.

Это сообщение отредактировал(а) Colloseum - 8.7.2008, 11:40
PM MAIL   Вверх
LOPUH
Дата 8.7.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Растение
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 15.2.2008
Где: Красноярск

Репутация: 3
Всего: 4



Ширина - это количество  столбцов?
Если так то  метод  .CurrentRegion  не подойдет?
Код

Set tbl = ActiveCell.CurrentRegion
colCount = tbl.Columns.Count



Это сообщение отредактировал(а) LOPUH - 8.7.2008, 12:06
PM MAIL   Вверх
Colloseum
Дата 8.7.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



Возвращает всегда единицу.
PM MAIL   Вверх
LOPUH
Дата 9.7.2008, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Растение
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 15.2.2008
Где: Красноярск

Репутация: 3
Всего: 4



Цитата(Colloseum @  8.7.2008,  22:31 Найти цитируемый пост)
Возвращает всегда единицу

Следовательно, вы берете ячейку, которая либо вообще не соприкасается с другими, либо вместе с  соседними образуюет вертикальный столбец, у которого ни справа, ни слева нет занятых ячеек..  Метод  .CurrentRegion возвращает прямоугольную область, содержащую все соседние ячейки, неважно в каком соседстве они находятся: справа, слева , выше, ниже или по диагонали.. Ну вот прикрепил простенький пример для иллюстрациии. А вам , как я понял нужно посчитать число столбцов в какой- то обособленной области.  Значит возьмите ячейку , которая находится в интересующей вас области, и воспользуйтесь ее методом   .CurrentRegion .


Это сообщение отредактировал(а) LOPUH - 9.7.2008, 03:54

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  ex.rar 5,76 Kb
PM MAIL   Вверх
Colloseum
Дата 9.7.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



Разобрался, здесь рулит .MergeArea.Count
В моем случае вот так.
ВЫБОРИЗ = PeriodRange(x, y).MergeArea.Count

2LOPUH спасибо за участие и навод на правильный ход мыслей.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.