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

Копирование данных из ячейки одного листа на другой с условием

29.05.2016, 13:16. Показов 1918. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Копирование данных из ячейки одного листа на другой с условием

На листе 1 в ячейках B4: ...
ОТКАЗ - 306002
3 - 306000
1 - 306001
5 - 306001
...

Необходимо условие чтобы извлекалась первое слово из ячейки и приравнивалось к условию
ОТКАЗ=9, 1=5, 5=3


На листе 2 в ячейках G4 : ... должно получаться

9
5
3
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2016, 13:16
Ответы с готовыми решениями:

Копирование данных из ячейки одного листа на другой перед тире
Скажите, необходимо скопировать из Листа1 ячееки F4: ... в лист 2 в ячейки I данные которые ...

Копирование значения ячейки с одного листа и вставка в другой
Здравствуйте! Делаю дз по информатике, VBA. Задание заключается вот в чем: есть два листа в...

Копирование значения ячейки из одного листа в другой при соблюдений условии
Добрый день! Помогите написать макрос для решения следующей проблемы. Имеется таблица Excel,...

Копирование данных с одного листа на другой
Здравствуйте! Помогите, пожалуйста, профану в программировании написать процедурку копирования с...

13
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
29.05.2016, 13:45 2
Сперва загоняем в словарь или коллекцию эти пары ОТКАЗ=9, 1=5, 5=3, затем циклом по исходным дааным определяем есть ли первое (из двух) слово в словаре/коллекции, если есть - собираем коллекцию из соответствующей пары, ну или можно сразу выгружать на второй лист.
Если собирали коллекцию - выгружаем в конце через промежуточный массив - так быстрее.
Т.к. примера файла нет - нет и кода.
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
29.05.2016, 13:50  [ТС] 3
Файл
Вложения
Тип файла: xls 123.xls (26.0 Кб, 11 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
29.05.2016, 14:04 4
Лучший ответ Сообщение было отмечено dmr12345 как решение

Решение

Код:
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
Option Explicit
 
Sub tt()
    Dim a, i As Long, arr, t As String, col As New Collection
 
    With CreateObject("scripting.dictionary"): .comparemode = 1
        .Item("ОТКАЗ") = 9
        .Item("1") = 5
        .Item("5") = 3
 
        a = Sheets(1).[b4].CurrentRegion.Value
        For i = 1 To UBound(a)
            arr = Split(a(i, 1), " - ")
            If UBound(arr) = 1 Then
                t = Trim(arr(0)): If .exists(t) Then col.Add .Item(t)
            End If
        Next
    End With
 
    ReDim a(1 To col.Count, 1 To 1)
    For i = 1 To col.Count: a(i, 1) = col(i): Next
    Sheets(2).[g4].Resize(col.Count, 1) = a
End Sub
1
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
29.05.2016, 14:13  [ТС] 5
Спасибо все получается.
Скажите как можно по проще в коде написать чтобы не писать до ячейки 65536, а указать до последней заполненной ячейки

Visual Basic
1
2
3
For i = 4 To 65536  'Копируем сколько лет
    Sheets(2).Cells(i, 6).Resize(, 1) = Split(Application.Trim(Sheets(1).Cells(i, 4)), , 3)
Next i
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
29.05.2016, 14:17 6
Нужно видеть данные, но обычно можно использовать (тут по первому столобцу)
Visual Basic
1
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
вот до этого значения и идите
Кроме того - 65536 это уже прошлый век, теперь в ходу миллионы
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
29.05.2016, 14:48  [ТС] 7
Использую для копирования даты рождения простую формулы
Range("E4:E65536").Copy Worksheets("Лист1").Range("E4")
пишу формулу по сложнее и вместо даты рождения появляются цифры, правда в этом примере др не работает
Вложения
Тип файла: xls 123.xls (34.0 Кб, 6 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
29.05.2016, 17:05 8
Не понял зачем копировать даты на себя, но вот так работает корректно (копирую рядом, поменяйте куда нужно):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub M1()
 
 
Range("E4:E" & Cells(Rows.Count, 5).End(xlUp).Row).Copy Worksheets("Лист1").Range("H4")  'копируем дату рождения
    
 
For i = 4 To Cells(Rows.Count, 4).End(xlUp).Row  'Копируем сколько лет
    Sheets(2).Cells(i, 6).Resize(, 1) = Sheets(1).Cells(i, 4)
Next i
 
End Sub
А цифры (числа) вместо дат могут появляться потому, что даты - это на самом деле в ячейке листа числа. В даты их превращает формат ячейки
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
29.05.2016, 17:30  [ТС] 9
Да с датами получается, ну почему то у меня в ячейке A1 в ковычках(в принципе это не важно)
Ошибка
Type mismatch
когда я вставляю код
Вложения
Тип файла: xls 123.xls (34.5 Кб, 6 просмотров)
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
29.05.2016, 17:35  [ТС] 10
А вообще скажите я в правильном направлении двигаюсь, первый макрос будет переделывать с первого листа на второй нужные и форматированные ячейки, и после второй макрос будет конвертировать второй лист в dbf файл кот будет далее сливаться с общей базой
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
29.05.2016, 17:51 11
Цитата Сообщение от dmr12345 Посмотреть сообщение
в ячейке A1 в ковычках
- что? где?
Хотя не важно ведь...
По ошибке - этот код и скопирпован криво (не заметили? ), и писался не для такого файла.
Теперь вместо
Visual Basic
1
a = Sheets(1).[b4].CurrentRegion.Value
переписывайте сами, чтоб корректный массив получился, все методы тут в теме есть. Хотя можно и без массива обойтись - берите прямо с листа, правда это сильно дольше будет...
По dbf ничего не скажу, не работаю с базами, но в общем думаю почему бы и нет? Только второй лист сперва нужно очистить, или каждый раз создать заново, чтоб мусор с предыдущего раза не остался.
1
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
30.05.2016, 12:45  [ТС] 12
Мне вместо этой строчки нудно писать ?
Visual Basic
1
a = Sheets(1).[b4].CurrentRegion.Value
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
30.05.2016, 12:47 13
Да, нудно
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 105
30.05.2016, 12:57  [ТС] 14
Я пытаюсь в этом коде вставить условие
Visual Basic
1
2
3
4
5
6
7
 With Worksheets(1)
      arr = .Range("C4:B" & .Cells(Rows.Count, "C").End(xlUp).Row).Value
    End With
    For i2 = 1 To UBound(arr)
        If arr(i2, 1) <> "" Then arr(i2, 1) = Split(arr(i2, 1))(0)
    Next
    Worksheets("Ëèñò1").Range("G4").Resize(UBound(arr), 1) = arr
0
30.05.2016, 12:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2016, 12:57
Помогаю со студенческими работами здесь

Копирование данных с одного листа на другой
Добрый день. Есть такая проблемка. В данном коде появляется ошибка при вставке данных из одной...

Копирование данных с одного листа на другой
Доброго времени суток. Помогите, пожалуйста придумать макрос для копирования. Имеется два листа....

Копирование данных с одного листа на другой
У меня еще 2 небольших вопросика. 1) Скопировать лист с именем &quot;list1&quot; в пустой уже существующий...

Копирование данных с одного листа на другой
Народ у меня такая проблема то что мне надо создавать документ, и даннве с 1 листа должны...


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

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