Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2012, 13:21   #1
Vastennis
 
Регистрация: 27.12.2012
Сообщений: 4
По умолчанию Нехитрое копирование диапозонов значений

Добрый день, уважаемые программисты.
На работе возникла задача регулярно выполнять преобразования таблицы способом, описанном в примере.
Есть ли возможность написать процедуру, которая бы выполняла эти действия?
Желательно, чтобы на вход процедуры подавалось три параметра (три диапазона).
Заранее спасибо!))
Вложения
Тип файла: rar Пример1.rar (6.5 Кб, 12 просмотров)
Vastennis вне форума Ответить с цитированием
Старый 27.12.2012, 14:49   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Почему 3 диапазона?

Код:
Option Explicit

Function MyTransp(r As Range)
    Dim i&, ii&, x&, a()
    a = r.Value
    ReDim b(1 To (UBound(a, 1) - 1) * (UBound(a, 2) - 1), 1 To 3)
    For i = 2 To UBound(a, 2)
        For ii = 2 To UBound(a, 1)
            x = x + 1
            b(x, 1) = a(ii, 1)
            b(x, 2) = a(1, i)
            b(x, 3) = a(ii, i)
        Next
    Next
    MyTransp = b
End Function
Код в стандартный модуль, выделяете диапазон для результата (можно с запасом), вводите в строке формул как формулу массива =MyTransp(A2:E6)
Можно затем спецвставкой заменить формулу на полученные значения, лишние #Н/Д удалить.
Столбцу с датами вручную задать нужный формат!
Вложения
Тип файла: rar Пример1.rar (12.8 Кб, 9 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 27.12.2012 в 14:52. Причина: Добавил файл
Hugo121 вне форума Ответить с цитированием
Старый 27.12.2012, 14:51   #3
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Код:
Sub Procedure_1()

    Dim rTopHeader As Excel.Range
    Dim rLeftHeader As Excel.Range
    Dim rData As Excel.Range
    Dim lRowsCount As Long
    Dim lStart As Long
    Dim i As Long
    
    'Даём имя диапазону с заголовками, которые сверху от данных.
    Set rTopHeader = Range("B2:E2")
    
    'Даём имя диапазону с заголовками, которые слева от данных.
    Set rLeftHeader = Range("A3:A6")
    
    'Даём имя диапазону, из которого берём данные.
    Set rData = Range("B3:E6")

    'Узнаём сколько строк в диапазоне с данными.
    lRowsCount = rData.Rows.Count
    
    'Задаём строку, с которой нужно вставлять данные.
    lStart = 3
    
    'Делаем цикл столько раз, сколько столбцов с данными.
    For i = 1 To rData.Columns.Count Step 1
    
        Cells(lStart, "H").Resize(lRowsCount, 1).Value = rLeftHeader.Value
        Cells(lStart, "I").Resize(lRowsCount, 1).Value = rTopHeader.Cells(1, i).Value
        Cells(lStart, "J").Resize(lRowsCount, 1).Value = rData.Columns(i).Value
        lStart = lStart + lRowsCount
        
    Next i

End Sub
Скрипт вне форума Ответить с цитированием
Старый 27.12.2012, 15:04   #4
Vastennis
 
Регистрация: 27.12.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Почему 3 диапазона?

Код:
Option Explicit

Function MyTransp(r As Range)
    Dim i&, ii&, x&, a()
    a = r.Value
    ReDim b(1 To (UBound(a, 1) - 1) * (UBound(a, 2) - 1), 1 To 3)
    For i = 2 To UBound(a, 2)
        For ii = 2 To UBound(a, 1)
            x = x + 1
            b(x, 1) = a(ii, 1)
            b(x, 2) = a(1, i)
            b(x, 3) = a(ii, i)
        Next
    Next
    MyTransp = b
End Function
Код в стандартный модуль, выделяете диапазон для результата (можно с запасом), вводите в строке формул как формулу массива =MyTransp(A2:E6)
Можно затем спецвставкой заменить формулу на полученные значения, лишние #Н/Д удалить.
Столбцу с датами вручную задать нужный формат!
Спасибо. 3 диапазононеобходимо в связи с тем, что форматы файлов могут быть разные. Разное количество строк и столбцов между наименованиями и данными.
Vastennis вне форума Ответить с цитированием
Старый 27.12.2012, 15:13   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну хорошо, 3:
Код:
Option Explicit

Function MyTransp(vsh As Range, gsh As Range, dannie As Range)
    Dim i&, ii&, x&, a()
    a = dannie.Value
    ReDim b(1 To UBound(a, 1) * UBound(a, 2), 1 To 3)
    For i = 1 To UBound(a, 2)
        For ii = 1 To UBound(a, 1)
            x = x + 1
            b(x, 1) = vsh(ii)
            b(x, 2) = gsh(i)
            b(x, 3) = a(ii, i)
        Next
    Next
    MyTransp = b
End Function
На листе
=MyTransp(A3:A6;B2:E2;B3:E6) (в весь диапазон, формула массива!)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 27.12.2012 в 15:22.
Hugo121 вне форума Ответить с цитированием
Старый 27.12.2012, 15:34   #6
Vastennis
 
Регистрация: 27.12.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Код:
Sub Procedure_1()

    Dim rTopHeader As Excel.Range
    Dim rLeftHeader As Excel.Range
    Dim rData As Excel.Range
    Dim lRowsCount As Long
    Dim lStart As Long
    Dim i As Long
    
    'Даём имя диапазону с заголовками, которые сверху от данных.
    Set rTopHeader = Range("B2:E2")
    
    'Даём имя диапазону с заголовками, которые слева от данных.
    Set rLeftHeader = Range("A3:A6")
    
    'Даём имя диапазону, из которого берём данные.
    Set rData = Range("B3:E6")

    'Узнаём сколько строк в диапазоне с данными.
    lRowsCount = rData.Rows.Count
    
    'Задаём строку, с которой нужно вставлять данные.
    lStart = 3
    
    'Делаем цикл столько раз, сколько столбцов с данными.
    For i = 1 To rData.Columns.Count Step 1
    
        Cells(lStart, "H").Resize(lRowsCount, 1).Value = rLeftHeader.Value
        Cells(lStart, "I").Resize(lRowsCount, 1).Value = rTopHeader.Cells(1, i).Value
        Cells(lStart, "J").Resize(lRowsCount, 1).Value = rData.Columns(i).Value
        lStart = lStart + lRowsCount
        
    Next i

End Sub
Спасибо. Было бы здорово, если бы была возможность вводить адрес ячейки (лист и ячейка) куда выводился бы результат.
Vastennis вне форума Ответить с цитированием
Старый 27.12.2012, 15:43   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Вариант решения формулами:
Вложения
Тип файла: zip Пример1.zip (7.7 Кб, 15 просмотров)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос - Копирование значений, а не формул. frslav Microsoft Office Excel 2 17.04.2012 20:04
Макрос: копирование значений из таблицы Leany Microsoft Office Excel 1 08.11.2010 00:05
Копирование значений и форматирования Eugenio Microsoft Office Excel 21 22.03.2010 19:28
Копирование и вставка значений tae1980 Microsoft Office Excel 7 29.05.2009 09:15