Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100

Копирование значений ячеек

07.11.2013, 12:30. Показов 5652. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Данный макрос копирует содержимое диапазона ячеек (B43:D66) с листов в имени которых содержатся скобки на лист "Ход поединков 1-8 финалов". Проблема в том, что в ячейках содержатся формулы. Как исправить, чтобы копировались значения ячеек?
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            Sh.[B43:D66].Copy Sheets("Ход поединков 1-8 финалов").Cells(i, 2)
            i = i + 24
        End If
    Next Sh
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2013, 12:30
Ответы с готовыми решениями:

Копирование значений диапазона ячеек
Здравствуйте! у меня есть код, который копирует ячейки с листа1 на лист2 Sheets("Лист1").Cells(1, 2).Resize(1, 3).Copy...

Копирование значений ячеек с определенным примечанием в отдельный столбец
Уважаемые программисты, прошу помочь с реализацией следующей задачи. На листе есть 20 именованных диапазонов вида «Книга№*», имена...

Копирование значений ячеек в столбце при соблюдении условия
В таблице есть два столбца. Всегда если в ячейке первого столбца есть значение, то в этой же ячейке второго столбца пусто, и наоборот. ...

57
 Аватар для Султанов
54 / 39 / 3
Регистрация: 25.01.2013
Сообщений: 368
07.11.2013, 14:00
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            p = Sh.[B43:D66].Value
            Sheets("Ход поединков 1-8 финалов").Cells(i, 2) = p
            i = i + 24
        End If
    Next Sh
End Sub
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 14:03  [ТС]
Спасибо большое! Всё отлично! Ещё огромная просьба, как прописать, если указанные диапазоны на листе пустые, то их не копировать?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 14:13
Здравствуйте. С Copy могут быть заморочки, и, к тому-же, код становится медленный. Лучше диапазон записать в массив, потом массив выложить в нужном месте.
Где-то так записали:
Visual Basic
1
2
dim marr()
marr=[B43:D66].value
а так, например, выложили:
Sheets("....").[b4].resize(ubound(marr,1), ubound(marr,2).value=marr
Если нужны только ячейки с значениями - используйте specialCells. Код будет длиннее, но удобнее.
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 14:25  [ТС]
Спасибо большое, но я не понимаю как это прописывать и в какой последовательности... Если не трудно пропишите это в коде...
0
 Аватар для Султанов
54 / 39 / 3
Регистрация: 25.01.2013
Сообщений: 368
07.11.2013, 14:36
VanBlack,
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            p = Sh.[B43:D66].Value
            If Not Array(p) Is Nothing Then
            Sheets("Ход поединков 1-8 финалов").Cells(i, 2) = p
                        i = i + 24
        End If: End If
    Next Sh
End Sub
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 14:37
Где-то так:
Visual Basic
1
2
3
4
5
6
7
8
9
sub asdf()
dim marr(), cC ar range,i&
   redim marr(1 to [b3:b13].cells.count, 1 to 1)
   err.number=0:   on error resume next
      for each cc in [b3:b12].specialcells(xlcelltypeconstants,3)
         i=i+1:   marr(i,1)=cc.value
      next
   if err.number<>0 then msgbox "NO VALUE IN CELLS"
end sub
И все. Дальше выкладываете где Вам удобно. И быстро, и легко.
Проверка на ошибку - возникнет, если в диапазоне не будет числовых и/или текстовых значений. Такая "болезнь" у specialcells, что это нужно делать.
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 14:50  [ТС]
Спасибо, но почему-то выдает ошибку (см. вложение)
Миниатюры
Копирование значений ячеек  
0
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 15:22  [ТС]
Этот код работает. Нельзя ли в нём поправить, чтобы пустые диапазоны не копировались...
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            Sheets("Ход поединков 1-8 финалов").Cells(i, 2).Resize(24, 3).Value = Sh.[B43:D66].Value
            i = i + 24
        End If
    Next Sh
End Sub
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 15:40
Пробуйте так.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long, marr(), cC As Range, j&
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            ReDim marr(1 To [B43:D66].Cells.Count, 1 To 1): j = 0
            Err.Number = 0: On Error Resume Next
               For Each cC In [B43:D66].SpecialCells(xlCellTypeConstants, 3)
                  j = j + 1: marr(j, 1) = cC.Value
               Next
            If Err.Number <> 0 Then MsgBox "NO VALUE IN CELLS"
               With Sheets("Ход поединков 1-8 финалов").Cells(i, 2)
                  .Resize(UBound(marr, 1), UBound(marr, 2)).Value = marr
               End With
        End If
    Next Sh
End Sub
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 15:50  [ТС]
Пишет NO VALUE IN CELLS и ничего не копирует...
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 16:13
Извиняюсь. Забыл
Замените это:
For Each cC In [B43 : D66].SpecialCells(xlCellTypeConstants, 3)
на это:
For Each cC In Sh.[B43 : D66].SpecialCells(xlCellTypeConstants, 3)
Если будет писать снова - смотрите на Sh, есть ли в диапазоне [B43 : D66] какие-то значения.

Добавлено через 17 минут
Сижу, жду с нетерпением звонок. Потому невнимательный. Еще после строки
.Resize(UBound(marr, 1), UBound(marr, 2)).Value = marr
добавьте i = i + 24
Но почему i=i+24 - догадаться не могу.
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 16:26  [ТС]
Значения есть, но всё всё равно выскакивает это сообщение и не копирует...

Добавлено через 12 минут
Не работает...
i=i+24 это копируемый диапазон содержит 24 строки. И с каждого листа он вставляется на следующие 24 строки (я так понял).
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 16:27
Сделаем проверку.
Кликните здесь для просмотра всего текста
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 Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long, marr(), cC As Range, j&
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            ReDim marr(1 To [b43:d66].Cells.Count, 1 To 1): j = 0
            Err.Number = 0: On Error Resume Next
               For Each cC In [b43:d66].SpecialCells(xlCellTypeConstants, 3)
                  j = j + 1: marr(j, 1) = cC.Value
               Next
            If Err.Number <> 0 Then
               MsgBox "NO VALUE IN CELLS"
                  Else
                     Sh.Activate:  Sh.[b43:d66].SpecialCells(xlCellTypeConstants, 3).Select
            End If
Stop
               With Sheets("Ход поединков 1-8 финалов").Cells(i, 2)
                  .Resize(UBound(marr, 1), UBound(marr, 2)).Value = marr
               End With
        End If
    Next Sh
End Sub

Когда код остановится на Stop, должен быть активирован очередной Sh выделены только ячейки с данными.
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 16:32  [ТС]
Спасибо за помощь, но ничего не получается... Опять выскочило сообщение и отправило в макрос на пункт Stop...
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 16:47
Ну и что! Оно не выкинуло ошибку! Продолжайте выполнение, и смотрите на вкладки листов. Листы должны активироваться и диапазоны должны выделяться. И не паникуйте! Добьем!

Добавлено через 9 минут
Пробуем с ним, гадом, по другому!!!
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long, marr(), j&
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            ReDim marr(1 To [b43:d66].Cells.Count, 1 To 2): j = 0
               With Sh.[b43:d66]
                  For i = LBound(marr, 1) To UBound(marr, 1)
                     If Application.CountA.Rows(j) > 0 Then
                        j = j + 1: marr(j, 1) = .Rows(j).Item(1).Value: marr(j, 2) = .Rows(j).Item(2).Value
                     End If
                  Next 'i
               End With
               With Sheets("Ход поединков 1-8 финалов").Cells(i, 2)
                  .Resize(UBound(marr, 1), UBound(marr, 2)).Value = marr:  i = i + 24
               End With
        End If
    Next Sh
End Sub
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 17:56
Вот смоделировал Вашу ситуацию, как я ее понял, и вроде работает.
Вложения
Тип файла: rar Поединки.rar (17.0 Кб, 13 просмотров)
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
07.11.2013, 23:39  [ТС]
Спасибо! Только приехал с занятий, сейчас опробую...

Добавлено через 1 час 0 минут
Увы, ничего не получилось... На вашей модели работает, но вы копируете с одного листа, а в моём случае их 25. И примерно половина из них ничего не содержат в указанных диапазонах.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
07.11.2013, 23:57
Главное, что работает. Сейчас мы его добьем...

Добавлено через 4 минуты
Пробуйте
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub v2_Add_в_Ход_поединков_Восьмые_финалов()
Dim Sh As Worksheet, i As Long, marr(), j&, cC As Range, a&, r&, f&
   For Each Sh In ThisWorkbook.Sheets
      ReDim marr(1 To [B43:D66].Rows.Count, 1 To 3): j = 0
         With Sh.[B43:D66]
            For i = LBound(marr, 1) To UBound(marr, 1)
            If Application.CountA(.Rows(i)) > 0 Then
               j = j + 1
               For f = LBound(marr, 2) To UBound(marr, 2): marr(j, f) = .Rows(i).Cells(f).Value: Next 'j
            End If
            Next 'i
         End With
         With Sheets("Ход поединков 1-8 финалов").Cells(1, 2)
            .Resize(UBound(marr, 1), UBound(marr, 2)).Value = marr:  i = i + 24
         End With
      Next 'each
End Sub
Добавлено через 3 минуты
О! Это
И примерно половина из них...
сейчас тоже исправлю.

Добавлено через 7 минут
Вот так
Кликните здесь для просмотра всего текста
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 v2_Add_в_Ход_поединков_Восьмые_финалов()
Dim Sh As Worksheet, i As Long, marr(), j&, cC As Range, a&, r&, f&
   For Each Sh In ThisWorkbook.Sheets
      Err.Number = 0: On Error Resume Next
         i = Sh.[B43:D66].SpecialCells(xlCellTypeConstants, 3).Cells.Count
            If Err.Number = 0 Then
               ReDim marr(1 To [B43:D66].Rows.Count, 1 To 3): j = 0
                  With Sh.[B43:D66]
                     For i = LBound(marr, 1) To UBound(marr, 1)
                     If Application.CountA(.Rows(i)) > 0 Then
                        j = j + 1
                        For f = LBound(marr, 2) To UBound(marr, 2): marr(j, f) = .Rows(i).Cells(f).Value: Next 'j
                     End If
                     Next 'i
                  End With
                  With Sheets("Ход поединков 1-8 финалов").Cells(1, 2)
                     .Resize(UBound(marr, 1), UBound(marr, 2)).Value = marr:  i = i + 24
                  End With
               End If
         On Error GoTo 0
   Next 'each
End Sub
1
2 / 2 / 0
Регистрация: 09.02.2013
Сообщений: 100
08.11.2013, 00:07  [ТС]
И снова нет. Ошибки не выдал, но скопировал какую-то фигню, даже не знаю откуда он её взял. Копирование должно быть только с листов, в названии которых содержаться скобки...

Добавлено через 2 минуты
Вот этот код работает, только в конце скопировал один пустой диапазон со значениями во всех ячейках диапазона #Н/Д
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Добавить_в_Ход_поединков_Восьмые_финалов()
    Dim Sh As Worksheet, i As Long, x As Range
    i = 3
    For Each Sh In ThisWorkbook.Sheets
        If InStr(3, Sh.Name, "(") > 0 Then
            Set x = Sh.[B43:D66]
            If Application.CountA(x) <> 0 Then
                Sheets("Ход поединков 1-8 финалов").Cells(i, 2).Resize(24, 3).Value = x.Value
                i = i + 24
            End If
        End If
    Next Sh
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2013, 00:07
Помогаю со студенческими работами здесь

Очистка значений ячеек макросом постоянно обновляемых ячеек
Здравствуйте, уважаемые) Помогите решить такую задачу. Есть некий журнал, нужно заполнять температуру с четкой исполнительской...

Копирование из ячеек
Добрый день! Необходима помощь в таком задании: Необходим скрипт VBA, который из ячейки А1 копирует информацию потом вставляет например в...

Копирование ячеек по 2 условиям V2
Добрый день! Возник такой вопрос, есть диапазон ячеек(города) и второй диапазон где хранятся коды товаров как найти строку по условиям...

Копирование ячеек по 2 условиям
Доброе утро! Есть определенная задача, суть такова: Добавить кнопку &quot;Скопировать ассортимент&quot;. Кнопка должна запускать функцию...

Копирование ячеек из шаблона
Задача Имеется шаблон - один лист в книге. (Шаблон.xlsx) Необходимо по команде(не важно какой) создать новую книгу с заданным именем и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru