Помогаем и разъясняем взаимодействие с ПО Ворд и Эксель на WordExceler.ru
Vba excel данные с одного столбца в столбец
how to use VBA’s End(xlRight) to copy one column’s value to another one?
like I want to always copy columnZ’s range(«Z4:Z203») value to another column’s range(«i5:i204»),how can i use End(xlright) check if the column was pasted and it will paste on next column ?
asked Jan 13, 2015 at 8:54
Why not simply copy always the needed range?
Sub test()
Range("Z4:Z203").Select
Selection.Copy
Range("I5:I204").Select
ActiveSheet.Paste
End Sub
Доброго времени суток. Пытаюсь разобраться с Vba Excel, и встала интересная задача Искал в интернете код, нашёл похожую тему на англоязычном сайте, там человек с подобной задачей обратился, ему написали вот это и сказали что всё работает Good
Код
Sub CopySpecifcColumn()
Set MR = Range("A1:e1")
For Each cell In MR
If cell.Value = "Date" Then
cell.EntireColumn.Copy
End If
If cell.Value = "Name" Then '<- Add these for each column title
cell.EntireColumn.Copy
End If
If cell.Value = "ID" Then
cell.EntireColumn.Copy
End If
If cell.Value = "Amount" Then
cell.EntireColumn.Copy
End If
Next cell
End Sub
Цель: Найти на Листе1 столбец, у которого в заголовке будет название «Date», например, и скопировать его в Лист2 в столбец, где будет такой же заголовок «Date» (заголовки могут гулять по столбцам, поэтому нужен их поиск). Суть: Я этот макрос вставил, а он вообще ничего не делает, даже не выделяет столбец, не то что уж куда-то его вставляет (в коде ни слова про вставку значения) У меня есть макрос, который ищет столбцы с определёнными заголовками, и удаляет всё кроме них, но как я не пытался их скрестить — получается туфта.
Код
Sub Удаляем_ненужные_столбцы()
Dim i&
List = "|Column1|Column2|Column3|"
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
If InStr(List, "|" & Cells(1, i) & "|") = 0 Then Columns(i).Delete
Next
End Sub
Подскажите как выйти (и можно ли) из данной ситуации, буду благодарен за подсказки.
Пытливый
Пользователь
Сообщений: 4587 Регистрация: 22.12.2012
#2
13.03.2023 21:19:00
Доброго. Найти что-либо в диапазоне (например, строку «Date» можно, например, методом Range.Find. Например, если у нас заголовки на активном столбце содержатся в диапазоне А1:D1, то найти значение Date можно как-то так:
Код
Dim my_range As Range
Set my_range = Range("A1", "D1").Find(What:="Date", LookIn:=xlValues, MatchCase:=False)
Далее, отталкиваясь от найденного значения, можно выделять столбцы (зачем целые столбцы? Можно же определенный диапазон, ячейки таблицы из этого столбца, зачем миллион с лишним ячеек выделять?), копировать, вставлять на новый лист и т.д. Т.е. примерно так — на одном листе нашли откуда копировать, на другом листе куда. Ну и скопировали.
Кому решение нужно — тот пример и рисует.
MikeVol
Пользователь
Сообщений: 229 Регистрация: 20.10.2020
Ученик
#3
15.03.2023 01:12:08
Дмитрий Астахов, Здравствуйте. Может так вам надо?
Код
Sub CopySpecifcColumn()
Dim Pos As Long
Dim vHeader As Variant
Dim rngFound1 As Range, rngFound2 As Range
Dim ArryHeader1() As String, ArryHeader2() As String
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ActiveWorkbook.Sheets(1)
Set ws2 = ActiveWorkbook.Sheets(2)
ArryHeader1 = Split("Date", ",") ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист исходник)
ArryHeader2 = Split("Date", ",") ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист назначения)
Application.ScreenUpdating = False
For Each vHeader In ArryHeader1
Set rngFound1 = ws1.Cells.Find(vHeader, , xlValues, xlWhole, 1, 1, 0)
If Not rngFound1 Is Nothing Then
Pos = Application.Match(vHeader, ArryHeader1, False) - 1
Set rngFound2 = ws2.Cells.Find(ArryHeader2(Pos), , xlValues, xlWhole, 1, 1, 0)
' ' Вставка без форматов ячеек
' Range(rngFound1.Offset(1), rngFound1.End(xlDown)).Copy
' rngFound2.Offset(1).PasteSpecial xlPasteValues
' Копирования столбца и вставка с форматом ячеек
Range(rngFound1.Offset(1), rngFound1.End(xlDown)).Copy Destination:=rngFound2.Offset(1)
End If
Next
ws2.Select. ' Можете закоментировать строку если не нужна активация второго листа (лист назначения)
Application.ScreenUpdating = True
End Sub
, Доброго времени суток. Макрос супер, правда не хотел через перечисление искать столбцы, искал только первый в списке, в данном примере «Date». Пытался заменить Split на что-то другое — эксель ругается, мол «не лезь дурак, оставь как есть». Поэтому я просто скопировал кусок начиная с «ArryHeader1…» вплоть до «Next», и уже там вписал другой столбец, и всё отлично заработало. Единственно момент, можно ли как-то найденные столбцы копировать полностью кроме первой строки? (имею в виду что он со второй строки (что кстати супер) копирует до последнего найденного символа, а если в столбце будет пробел, то всё после него он не увидит). Просто таблица, ИЗ которой я хочу копировать столбцы, ведётся не мной, а мало ли что там человек может напутать, намешать. И чтобы была защита от дурака, я хочу копировать либо весь столбец, либо для меньше загруженности Range задать. Но сам я как дурак с этим Range.EntireColumn попытался втиснуться, но пока безуспешно. Буду пробовать дальше, вдруг нащупаю «правильное направление мысли»
Изменено: Дмитрий Астахов — 15.03.2023 09:59:50 (Скорее всего изъяснился в тексте я так себе, поэтому прикреплю файл )))
Ігор Гончаренко
Пользователь
Сообщений: 13746 Регистрация: 01.01.1970
#5
15.03.2023 10:50:08
пробуйте этот
Код
Sub CopySameColumns()
Dim dc, c, i&, rg As Range, ws As Worksheet
Set dc = CreateObject("Scripting.Dictionary")
For Each c In Array("Date", "Name", "ID", "Amound")
dc(c) = 0
Next
Set ws = Worksheets(1)
For i = 1 To ws.Cells(1, Columns.Count).End(xlToLeft).Column
If dc.Exists(ws.Cells(1, i).Value) Then
dc(ws.Cells(1, i).Value) = i
Set rg = ws.Cells(Rows.Count, i).End(xlUp)
If rg.Row > 1 Then Range(ws.Cells(2, i), rg).ClearContents
End If
Next
For Each c In dc.keys
If dc(c) = 0 Then dc.Remove c
Next
With Worksheets(2)
For i = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
If dc.Exists(.Cells(1, i).Value) Then
Set rg = .Cells(Rows.Count, i).End(xlUp)
If rg.Row > 1 Then
Range(.Cells(2, i), .Cells(Rows.Count, i).End(xlUp)).Copy _
ws.Cells(2, dc(.Cells(1, i).Value))
End If
End If
Next
End With
End Sub
Изменено: Ігор Гончаренко — 15.03.2023 10:50:40
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
MikeVol
Пользователь
Сообщений: 229 Регистрация: 20.10.2020
Ученик
#6
15.03.2023 11:48:15
Дмитрий Астахов, Здравствуйте! А так точно то что вам нужно?
Код
Option Explicit
Sub CopySpecifcColumn_v2()
Dim Pos As Long
Dim vHeader As Variant
Dim rngFound1 As Range, rngFound2 As Range
Dim ArryHeader1() As String, ArryHeader2() As String
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ActiveWorkbook.Sheets(1)
Set ws2 = ActiveWorkbook.Sheets(2)
ArryHeader1 = Split("Date,Pon", ",") ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист исходник)
ArryHeader2 = Split("Date,Pon", ",") ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист назначения)
Application.ScreenUpdating = False
For Each vHeader In ArryHeader1
Set rngFound1 = ws1.Cells.Find(vHeader, , xlValues, xlWhole, 1, 1, 0)
If Not rngFound1 Is Nothing Then
Pos = Application.Match(vHeader, ArryHeader1, False) - 1
Set rngFound2 = ws2.Cells.Find(ArryHeader2(Pos), , xlValues, xlWhole, 1, 1, 0)
' Копирования столбца и вставка с форматом ячеек
Range(rngFound1.Offset(1), rngFound1(Rows.Count).End(xlUp)).Copy Destination:=rngFound2.Offset(1)
End If
Next
Application.ScreenUpdating = True
MsgBox "А теперь Правильно? ", vbQuestion
End Sub
Обратите внимание как правильно надо было вписать заголовки в ArryHeader1 и ArryHeader2 а не лепить горбатого! В комментариях для этих строк я же написал что и как!
Ігор Гончаренко
, шо-то он мне выдал ошибку 400, и усё, вроде даже перепроверил, может недокопировал чего, а он всё равно не хочет
MikeVol
, теперь всё супер, спасибо за Ваше терпение и труд )) Эти кавычки в экселе меня периодически ставят в тупик, и частенько я их пихаю уже куда не следовало бы. Ошибка новичка, так сказать Ещё раз спасибо ))
в файле из сообщния 4 с такой строкой: For Each c In Array(«Date», «Pon», «ID», «Amound») сработало (с листа 2 на лист 1 скопированы данные с колонок Date и Pon)
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
MikeVol
Пользователь
Сообщений: 229 Регистрация: 20.10.2020
Ученик
#10
15.03.2023 13:01:27
Дмитрий Астахов, А, так вам надо было копировать столбцы со второго листа в первый лист? Тогда мой код не будет работать! Код Ігор Гончаренко из его
#5
тогда то что вам надо!
Обновление! Хотя чуток переделав код то получим то что и требуется, копирование со второго листа на первый лист.
Код
Option Explicit
Sub CopySpecifcColumn_v3()
Dim Pos As Long
Dim vHeader As Variant
Dim rngFound1 As Range, rngFound2 As Range
Dim ArryHeader1() As String, ArryHeader2() As String
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ActiveWorkbook.Sheets(1)
Set ws2 = ActiveWorkbook.Sheets(2)
ArryHeader1 = Split("Date,Pon", ",") ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист исходник)
ArryHeader2 = Split("Date,Pon", ",") ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист назначения)
Application.ScreenUpdating = False
For Each vHeader In ArryHeader2
Set rngFound1 = ws1.Cells.Find(vHeader, , xlValues, xlWhole, 1, 1, 0)
If Not rngFound1 Is Nothing Then
Pos = Application.Match(vHeader, ArryHeader2, False) - 1
Set rngFound2 = ws2.Cells.Find(ArryHeader1(Pos), , xlValues, xlWhole, 1, 1, 0)
' Копирования столбца и вставка с форматом ячеек
Range(rngFound2.Offset(1), rngFound2(Rows.Count).End(xlUp)).Copy Destination:=rngFound1.Offset(1)
End If
Next
Application.ScreenUpdating = True
MsgBox "А теперь Правильно? ", vbQuestion
End Sub
Добрый день! Пытаюсь написать макрос, который бы копировал значения из столбца «Данные 8» в столбец «Данные 4», но никак не могу победить проблему — данные не копируются. Подскажите, пожалуйста, где я ошибся в коде?
К сообщению приложен файл:
6761630.xls
(34.0 Kb)
Ответить
lebensvoll
Дата: Суббота, 05.12.2020, 16:25 |
Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 1002
Репутация: 30 ±
Замечаний:
0% ± Excel 2010
Leojse, я не силен в макросах Но мне кажется Вы на кнопку не установили само выполнение (((( А если установить само выполнение мокроса 1 То вот тут [vba]
Код
e.FormulaLocal = «=» & e.Offset(0, 5).Address
[/vba] код ругается
К сообщению приложен файл:
5957291.xls
(39.0 Kb)
Кто бы ты ни был, мир в твоих руках
Сообщение отредактировал lebensvoll — Суббота, 05.12.2020, 17:02
Ответить
gling
Дата: Суббота, 05.12.2020, 16:28 |
Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2449
Репутация: 652 ±
Замечаний:
0% ± 2010
Здравствуйте. А без формулы никак?[vba]
Код
For Each e In Range(«D12:D» & f) ‘e.FormulaLocal = «=» & e.Offset(1, 5).Address e.Value = e.Offset(0, 5).Value Next e
[/vba]
ЯД-41001506838083
Сообщение отредактировал gling — Суббота, 05.12.2020, 16:32
Ответить
Leojse
Дата: Суббота, 05.12.2020, 16:36 |
Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний:
0% ± 2010/2013
gling, спасибо за подсказку, но так тоже не сработало. Выдает ошибку «Application-defined or object-defined error»
К сообщению приложен файл:
0946168.xls
(33.0 Kb)
Сообщение отредактировал Leojse — Суббота, 05.12.2020, 17:16
Ответить
bmv98rus
Дата: Суббота, 05.12.2020, 17:33 |
Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4009
Репутация: 760 ±
Замечаний:
0% ± Excel 2013/2016
Это ? Range(«D12:D» & f).SpecialCells(xlCellTypeVisible).Address $1:$9,$12:$65536 все пояснит
а это [vba]
Код
For Each e In Range(«D12:D» & f) If Not e.Rows.Hidden Then e.Value = e.Offset(0, 5).Value Next
[/vba] исправит.
Замечательный Временно просто медведь , процентов на 20.
Ответить
Pelena
Дата: Суббота, 05.12.2020, 17:34 |
Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 18797
Репутация: 4284 ±
Замечаний:
± Excel 2016 & Mac Excel
Попробуйте так [vba]
Код
Sub Макрос1() If Not ActiveSheet.AutoFilterMode Then Rows(«9:9»).AutoFilter ActiveSheet.Range(«A:I»).AutoFilter Field:=1, Criteria1:=»Расходники»
Dim e As Range Dim f As Long f = Cells(Rows.Count, 1).End(xlUp).Row If f >= 12 Then For Each e In Range(«D12:D» & f) If Not e.EntireRow.Hidden Then e = e.Offset(0, 5) Next e End If
End Sub
[/vba]
«Черт возьми, Холмс! Но как??!!» Ю-money 41001765434816
Ответить
Leojse
Дата: Суббота, 05.12.2020, 19:52 |
Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 1 ±
Замечаний:
0% ± 2010/2013
Pelena, огромное Вам спасибо!!!
Ответить
gling
Дата: Суббота, 05.12.2020, 23:11 |
Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 2449
Репутация: 652 ±
Замечаний:
0% ± 2010
но так тоже не сработало.
А зачем вы оставили это .SpecialCells(xlCellTypeVisible), в сообщении 3 этого нет. Уберите это в файле из сообщения 4 и будет работать. А можно и не проверять наличие автофильтра, он же всё равно ставится в 9 строку. Еще вариант[vba]
Код
Sub Макрос1() Dim e As Range Dim f As Long f = Cells(Rows.Count, 1).End(xlUp).Row Range(«A9:I» & f).AutoFilter Field:=1, Criteria1:=»Расходники» If f >= 12 Then For Each e In Range(«D12:D» & f) e.Value = e.Offset(0, 5).Value Next e End If End Sub
[/vba]
ЯД-41001506838083
Сообщение отредактировал gling — Суббота, 05.12.2020, 23:33
‘1. Сбрасываем автофильтр, если он есть, иначе макрос не сможет вставить данные из массива. If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilter.ShowAllData End If
‘2. Поиск последней строки в столбце B. ‘ End не ищет в скрытых строках. lr = Cells(Rows.Count, «B»).End(xlUp).Row
‘3. Копирование данных из столбца B в массив. ‘ Данные копируются со строки 2 (подразумевается, что первая строка это шапка). src() = Range(«B2:B» & lr).Value
‘4. Создание ячеек в массиве-результате. ReDim res(UBound(src), 1)
‘5. Перемещение ячеек, в которых есть слово «ткань» из массива «src» в массив «res». For i = 1 To UBound(src) ‘ Если в ячейке есть слово «ткань». If InStr(src(i, 1), «ткань») <> 0 Then ‘ Копирование данных из массива «src» в массив «res». res(i, 1) = src(i, 1) ‘ Очистка ячейки в массиве «src». src(i, 1) = Empty End If Next i
Собсетвено есть данные в столбцах А , В , С , D.
Нужно сделать так что бы столбец С поменялся местами со столбцом В вместе со всеми данными? с помошью макроса VBA
Буду благодарен любым вашим мыслям!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2014, 15:47
19
15136 / 6410 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
07.05.2014, 15:56
2
Banzayl2w, запишите макрорекордером действия: выделить ст. С, Ctrl+X, выделить ст. В, Вставить — Вставить вырезанные ячейки.
0
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
07.05.2014, 16:07
[ТС]
3
надо бы довести «до ума» через получившиеся макросы вручную в VB
Добавлено через 2 минуты
просто как вы говорите делать данные куда вставляешь теряются а надо что бы они сместились оставаясь в табличке
Для решения учебного задания этого достаточно. Если убрать лишнее, то так:
Visual Basic
1
2
3
4
Sub Макрос2()
Columns("C").Cut
Columns("B").Insert
EndSub
1
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
08.05.2014, 11:44
[ТС]
8
Не работает макрос не переносит (
1
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,562
08.05.2014, 11:49
9
Не буду спорить — но счёт 2:1 не в Вашу пользу — у меня и Алексея работает
По макросу OLEGOFF аналогично 2:1
0
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
08.05.2014, 12:21
[ТС]
10
файл ниже вот нужно поменять столбец A cо столбцом D местами, и код не хочет работать)
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,562
08.05.2014, 12:53
11
И где тот код, который не хочет работать?
0
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
08.05.2014, 12:59
[ТС]
12
ниже
0
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,562
08.05.2014, 13:00
13
Вообще понятно — уж сколько говорено, что объединение ячеек — эло! Повторю ещё раз.
0
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
08.05.2014, 13:04
[ТС]
14
тоесть никак не решить эту задачу? с переносом данных из одного столбца в другой?
0
Hugo121
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,562
08.05.2014, 13:04
15
Visual Basic
1
2
3
4
5
6
Sub Макрос333()
Columns(1).Cut
Columns(4).Insert
Columns(4).Cut
Columns(1).Insert
EndSub
Только сперва уберите объединение в A!
1
Казанский
15136 / 6410 / 1730
Регистрация: 24.09.2011
Сообщений: 9,999
08.05.2014, 13:06
16
Сообщение было отмечено Banzayl2w как решение
Решение
С автоматическим снятием объединения ячеек в задействованных столбцах
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Макрос1()
Dim c As Range
ForEach c In Intersect(Range("A:A,D:D"), ActiveSheet.UsedRange)
If c.MergeCells ThenIf c.MergeArea.Columns.Count > 1 Then c.UnMerge
EndIfNext
Columns("D").Cut
Columns("A").Insert
Columns("B").Cut
Columns("E").Insert
EndSub
1
6875 / 2807 / 533
Регистрация: 19.10.2012
Сообщений: 8,562
08.05.2014, 13:07
17
Сообщение было отмечено Banzayl2w как решение
Решение
И чего не все варианты пробовали? Вариант через массив работает «из коробки», только диапазоны изменить, и объединения не мешают.
И это будет именно перенос данных в чистом виде!
1
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
08.05.2014, 13:14
[ТС]
18
Огромное спасибо!
0
1062 / 506 / 137
Регистрация: 27.02.2013
Сообщений: 1,451
08.05.2014, 13:24
19
У меня все работает…?
0
1 / 1 / 0
Регистрация: 14.04.2014
Сообщений: 40
08.05.2014, 13:26
[ТС]
20
Да, все работает!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2014, 13:26
Помогаю со студенческими работами здесь
Макрос VBA Добрый день!Помогите с задачей.
Создать макрос , доступный во всей рабочей книге, в
процессе…
Макрос.VBA Создать Mакрос в Word, так чтобы он находил в тексте буквосочетание и выделял его цветом, а потом…
Макрос VBA Помогите написать макрос или подскажите как должен выглядеть. есть база данных макрос ищет по…
Перемещение с переименованием файлов в vba Здравствуйте. Есть задача, найти в целевой папке список имен фото, находящийся в столбце 1 Excel, и…