Excel макрос копирование не пустых ячеек

 

Доброго времени суток господа!

Помогите с макросом который будет копировать значения только заполненных ячеек ( то есть пустые ячейки он не трогает) из одного массива в другой, В примере указан массив копирования и массив вставки. И чтобы имеющиеся значения в массиве вставке не затрагивались. Спасибо :)

Так же указан желаемый результат.

Прикрепленные файлы

  • пример.xlsx (10.96 КБ)

Впитываю знания, как борщ после тренировки ^^)

 

gling

Пользователь

Сообщений: 4024
Регистрация: 01.01.1970

Здравствуйте. Включаете запись макроса макрорекордером — Копируете Массив копирования — Активируете левую верхнею ячейку Массива вставки — открываете специальную вставку — ставите галку Пропускать пустые ячейки — ОК — Выключаете запись макроса. Всё макрос готов, можно пользоваться, при необходимости можно подправить и изменить ячейки. Но зачем это надо, если и без макроса можно быстренько всё сделать.
Хотите закрасить ячейки с числами, тоже не сложно. Выделяете диапазон—жмете F5 — Выделить — константы — оставляете галку на числа — ОК — Выбираете нужный цвет заливки ячеек.

Изменено: gling29.08.2020 02:12:32

 

Молодое_Поколение

Пользователь

Сообщений: 144
Регистрация: 10.06.2019

#3

29.08.2020 14:15:11

Помогите победить ошибку,excel не копирует разные фрагменты, что делать?

Цитата
Данная команда неприменима для нескольких фрагментов
Код
Sub Макрос1()
With Worksheets("Лист1")
    Sheets("Лист1").Select
    Range("B5:F32").Select
    Selection.SpecialCells(xlCellTypeConstants, 1).Select
    Selection.Copy
    Range("J9:N36").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
            Application.CutCopyMode = False
End With
End Sub

Впитываю знания, как борщ после тренировки ^^)

 

Borrusale

Пользователь

Сообщений: 173
Регистрация: 27.02.2013

Привет

Быстрее молнии, быстрее ветра, быстрее калькулятора

 

Mershik

Пользователь

Сообщений: 8277
Регистрация: 03.12.2015

#5

29.08.2020 15:30:55

Молодое_Поколение, Добрый день, еще вариант.

Код
Option Base 1
Sub sss()
Dim arrin, arrout(1 To 27, 1 To 5)
arrin = Range("B6:F32")
For r = 1 To 27
    For c = 1 To 5
        If IsEmpty(arrin(r, c)) Then
            arrout(r, c) = "хххххххх"
        Else
            arrout(r, c) = arrin(r, c)
        End If
    Next c
Next r
Range("J6:N32") = arrout
End Sub

Не бойтесь совершенства. Вам его не достичь.

 

Borrusale, в рабочем варианте большая таблица тормозит сильно, есть способы быстрее сделать? прикрепил пример рабочей таблицы с вашим макросом
Файл весит 316кб — поместил в облако

https://cloud.mail.ru/public/3FFv/CJdPrWkHY

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

Впитываю знания, как борщ после тренировки ^^)

 

Кто разбирается в данной теме, подскажите решение этой проблемы

Впитываю знания, как борщ после тренировки ^^)

 

Михаил Витальевич С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#8

30.08.2020 18:01:21

Цитата
Молодое_Поколение написал:
подскажите решение этой проблемы

какой именно? Этой?

Цитата
Молодое_Поколение написал:
о он заменяет пробелы на «хххххх»,

Так в его коде на «хххххх» заменяются не пробелы, а пустые ячейки. Вам что нужно?

зы.
Вы ж сами показали, в «Как должно быть — «хххххх»

Изменено: Михаил Витальевич С.30.08.2020 18:05:56

 

Михаил Витальевич С., в сообщении #6 в облаке приведен последний пример кнопка «Borrusale» макрос help, он работает так как нужно, только медленный, мне нужно чтобы он работал быстрее и все  :)  

Впитываю знания, как борщ после тренировки ^^)

 

Borrusale

Пользователь

Сообщений: 173
Регистрация: 27.02.2013

Напишите адрес ячейки в которой есть пробел  

Быстрее молнии, быстрее ветра, быстрее калькулятора

 

Михаил Витальевич С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#11

30.08.2020 18:27:00

вот так будет чуть быстрее, но не очень:

Код
Sub help()
'
    Set SourceRng = Range("A1:ai1000")
    Set ResultRng = Range("AK1:BS1000")
    Set InsertRng = Range("AK1:BS1000")
    Application.ScreenUpdating = False 'отключаем экран
    For i = 1 To SourceRng.Count
        If Len(SourceRng.Item(i).Value) = 0 Then
            ResultRng.Item(i).Value = InsertRng.Item(i).Value
        Else
            ResultRng.Item(i).Value = SourceRng.Item(i).Value
        End If
    
    Next
    Application.ScreenUpdating = True 'включаем экран
   
End Sub

######################################
PS.
А почему нельзя

Код
Sub ttt()
    Range("A1").CurrentRegion.Copy Range("AK1")
End Sub

не понял :qstn:

Изменено: Михаил Витальевич С.30.08.2020 18:33:19

 

Borrusale, ваш макрос работает так как я и хотех единственное, что нужно быстрее — массив состоит из 35 000 ячеек, да и к тому же некоторые строки имеют по 250 символов …. очень долго…

А пробел — первая таблица 37 строка

Впитываю знания, как борщ после тренировки ^^)

 

Borrusale

Пользователь

Сообщений: 173
Регистрация: 27.02.2013

#13

30.08.2020 18:37:24

Цитата
Молодое_Поколение написал:
37 строк

у Вас всего 27 строк. Адрес ячейки пожалуйста ? Например «B15» «D7»
Пробелы есть только в названиях таблиц (ctrl+F не находит на листе пробелы)

Изменено: Borrusale30.08.2020 18:40:06

Быстрее молнии, быстрее ветра, быстрее калькулятора

 

Михаил Витальевич С.,

для чего это мне нужно?

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

Изменено: Молодое_Поколение30.08.2020 18:39:39

Впитываю знания, как борщ после тренировки ^^)

 

Borrusale, Borrusale,

файл с 35 000 ячейками весит больше 100кб — поэтому я поместил его в облако

https://cloud.mail.ru/public/3FFv/CJdPrWkHY

Впитываю знания, как борщ после тренировки ^^)

 

New

Пользователь

Сообщений: 4581
Регистрация: 06.01.2013

#16

30.08.2020 18:45:00

Может так подойдёт? )

Код
Sub ttt()
Dim iRow As Long, LastRow As Long
    
    Application.ScreenUpdating = False
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Range("A1:AI" & LastRow).Copy Range("AK1")
    LastRow = Cells(Rows.Count, "AK").End(xlUp).Row
    For iRow = LastRow To 1 Step -1
        If Len(Cells(iRow, "AK")) = 0 Then Rows(iRow).EntireRow.Delete
    Next iRow
    Application.ScreenUpdating = True
End Sub

Изменено: New30.08.2020 18:45:11

 

Borrusale

Пользователь

Сообщений: 173
Регистрация: 27.02.2013

#17

30.08.2020 18:47:37

Молодое_Поколение,я не могу его открыть . Мое предположение что в пустых ячейках что то есть. Замените IsEmpty на len в коде  предложенном Mershik:

Код
Option Base 1Sub sss()
Dim arrin, arrout(1 To 27, 1 To 5)
arrin = Range("B6:F32")
For r = 1 To 27
    For c = 1 To 5
        If len(arrin(r, c))=0 Then
            arrout(r, c) = "хххххххх"
        Else
            arrout(r, c) = arrin(r, c)
        End If
    Next c
Next r
Range("J6:N32") = arrout
End Sub

Изменено: Borrusale30.08.2020 18:47:58

Быстрее молнии, быстрее ветра, быстрее калькулятора

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#18

30.08.2020 18:47:48

Цитата
Молодое_Поколение написал:
файл с 35 000 ячейками весит больше 100кб

И что? У нас ограничение в 300.

 

New, к сожалению нет, он удаляет пустые строки ..  :cry:  

Впитываю знания, как борщ после тренировки ^^)

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#20

30.08.2020 18:58:00

Цитата
Молодое_Поколение написал:
Юрий М , вот так вот  

Вы это о чём? Я Вам напомнил, что ограничение не 100, а 300. Да и никому не нужен Ваш рабочий файл. Можно ведь создать НЕБОЛЬШОЙ аналог для форума. А Вы всё норовите рабочий вариант подсунуть.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Думаю технически быстрее будет сперва удалить эти немногие пустые строки в источнике (были тут супербыстрые коды, например от ZVI

https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=8&TID=24531&TITLE_SEO=24531&MID=335928#message335928

), а уже затем весь нормализованный диапазон и скопировать. Если ещё нужно.

Изменено: Hugo30.08.2020 19:01:09

 

Молодое_Поколение

Пользователь

Сообщений: 144
Регистрация: 10.06.2019

#22

30.08.2020 19:06:35

пока что лучшее решение вот это

Код
Sub help()
'
    Set SourceRng = Range("A1:ai1000")
    Set ResultRng = Range("AK1:BS1000")
    Set InsertRng = Range("AK1:BS1000")
    Application.ScreenUpdating = False 'отключаем экран
    For i = 1 To SourceRng.Count
        If Len(SourceRng.Item(i).Value) = 0 Then
            ResultRng.Item(i).Value = InsertRng.Item(i).Value
        Else
            ResultRng.Item(i).Value = SourceRng.Item(i).Value
        End If
     
    Next
    Application.ScreenUpdating = True 'включаем экран
    
End Su

Впитываю знания, как борщ после тренировки ^^)

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Т.е. удаление не взлетает? Видел смотрели :)

 

Михаил Витальевич С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#24

30.08.2020 19:17:32

Цитата
Молодое_Поколение написал:
бывает так что некоторые значения не прогружаются и на их месте пустая ячейка — мне нужно чтобы пустые ячейки НЕкопировались.. Тоесть чтобы в таблице всегда были последние обновленные значения.

Вот объяснили б сразу нормально — еже б дано было сделано…
Т.Е, — диапазон у вас есть и его размер постоянен; ежедневно обновляется, но бывает, не все ячейки заполнены. Так? И вот, которые в новом пустые не должны затирать старые, в которых есть значения — правильно я понял?

 

Михаил Витальевич С., так точно!

Надо научиться у вас правильно объяснять :)

Впитываю знания, как борщ после тренировки ^^)

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Ну тогда точно удалять — не вариант. Почему бы так и не сказать?
Тогда быстрее добить эти пустые старыми (прежними) данными и вообще никуда больше ничего не копировать :)
Ну или копирнуть теперь всё это назад.

Изменено: Hugo30.08.2020 19:32:48

 

Mershik

Пользователь

Сообщений: 8277
Регистрация: 03.12.2015

Hugo, хоть к 25 сообщению узнали истинную задачу

Не бойтесь совершенства. Вам его не достичь.

 

Михаил Витальевич С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#28

30.08.2020 19:44:18

на основе макроса Mershik, из #5 и файла из первого сообщения:

Код
Sub ttt()
    Dim arrin(), arrout(), R&, C&
    arrin = Range("B6").CurrentRegion.Value
    arrout = Range("J10").CurrentRegion.Value
    
    For R = 1 To UBound(arrin)
        For C = 1 To UBound(arrin, 2)
            If Len(arrin(R, C)) = 0 Or arrin(R, C) = " " Then
        '        ни чего не делаем
            Else
                arrout(R, C) = arrin(R, C)
            End If
        Next C
    Next R
    Range("J10").CurrentRegion.Value = arrout
End Sub

Прикрепленные файлы

  • Молодое_Поколение.xlsm (18.69 КБ)

Изменено: Михаил Витальевич С.30.08.2020 19:54:34

 

Михаил Витальевич, дома буду обязательно посмотрю и дам обратную связь, спасибо за помощь 😎

Впитываю знания, как борщ после тренировки ^^)

 

БМВ

Модератор

Сообщений: 21376
Регистрация: 28.12.2016

Excel 2013, 2016

#30

30.08.2020 20:27:02

Код
    Range("B6").CurrentRegion.Copy
    Range("J10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True

Я что-то упустил? на примере из облака 1.7 секунды

Изменено: БМВ30.08.2020 20:32:31

По вопросам из тем форума, личку не читаю.

Макрос копирования непустых ячеек

Автор Bomont, 07.12.2011, 12:04

« назад — далее »

Господа, помогите с решением такой задачки:

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

Как самый простой вариант, можно макросом перебирать все ячейки в стоблце и копировать каждую, если она не пустая. Однако если ячеек очень много и таких операций надо проводить много — это занимает много времени. Но наверняка найдется более лучший (бычтрый) способ?

P.S. вручную это делается так: ставится фильтр на столбец, где убирается галочка с пустых ячеей. Далее все это выделяется, копируется и при в ставке на новый лист — пустых ячеек уже нет.


ЦитироватьP.S. вручную это делается так: ставится фильтр на столбец, где убирается галочка с пустых ячеей. Далее все это выделяется, копируется и при в ставке на новый лист — пустых ячеек уже нет.

А Вы макрорекордером не пробовали пользоваться. Я по Вашему алгоритму попробовал, смотрите, что получилось.


Цитата: ShAM от 07.12.2011, 12:47
А Вы макрорекордером не пробовали пользоваться. Я по Вашему алгоритму попробовал, смотрите, что получилось.

Примерно то же самое, только макрорекодер подправлен немного

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Или

Sub Макрос9()
Sheets("Лист3").Range("A:A").SpecialCells(2).Copy Sheets("Лист2").Range("A1")
End Sub


Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Цитата: nilem от 07.12.2011, 13:20
Или
Sub Макрос9()
Sheets("Лист3").Range("A:A").SpecialCells(2).Copy Sheets("Лист2").Range("A1")
End Sub

Всем большое спасибо! Вот одной строчкой и искал вариант! Еще раз спасибо за помощь!!!


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Макрос копирования непустых ячеек

Looks like you may be making some common rookie mistakes here (it’s okay we all did it).


VBA example with line-by-line explanations

TIP: Try not to use «Select» or «Copy». Why use select when all you have to do is reference the cells themselves? For example, instead of using

Sheets("codes").Select
Range("A5:A100").Select
Selection.Copy
Sheets("Sheet2").Select
Range("B28").Select
ActiveSheet.Paste

Just use

dim mySheet as Worksheet, myOtherSheet as Worksheet, myBook as Workbook 'Define your workbooks and worksheets as variables
set myBook = Excel.ActiveWorkbook
set mySheet = myBook.Sheets("codes")
set myOtherSheet = myBook.Sheets("Sheet2")

dim i as integer, j as integer 'Define a couple integer variables for counting

j = 28 'This variable will keep track of which row we're on in Sheet2 (I'm assuming you want to start on line 28)
for i = 5 to 100 'This is the beginning the the loop which will repeat from 5 to 100 . . .
   if mySheet.Cells(i,1).value <> "" then ' . . . for each digit, it will check if the cell's value is blank. If it isn't then it will . . .
      myOtherSheet.Cells(j,2).value = mySheet.Cells(i,1).value ' . . . Copy that value into the cell on Sheet2 in the row specified by our "j" variable.
      j = j + 1 'Then we add one to the "j" variable so the next time it copies, we will be on the next available row in Sheet2.
   end if
next i 'This triggers the end of the loop and moves on to the next value of "i".

I did the same thing all the time when I first started, and it never works out right. «Select» causes errors left and right. Use my code, read the comments, and you’ll be fine. A quick WARNING: I don’t have Excel on this computer so I couldn’t test the code. If it doesn’t work for some reason, leave me a comment and tomorrow I’ll fix it at work.

The above code will omit blank cells completely when copying the data over to your second sheet. If you want to input a certain text for blank cells instead (like «N/A»), then you can use the following:

 dim mySheet as Worksheet, myOtherSheet as Worksheet, myBook as Workbook 'Define your workbooks and worksheets as variables
 set myBook = Excel.ActiveWorkbook
 set mySheet = myBook.Sheets("codes")
 set myOtherSheet = myBook.Sheets("Sheet2")

 dim i as integer, j as integer 'Define a couple integer variables for counting

 j = 28 'This variable will keep track of which row we're on in Sheet2 (I'm assuming you want to start on line 28)
 for i = 5 to 100 'This is the beginning the the loop which will repeat from 5 to 100 . . .
    if mySheet.Cells(i,1).value <> "" then ' . . . for each digit, it will check if the cell's value is blank. If it isn't then it will . . .
       myOtherSheet.Cells(j,2).value = mySheet.Cells(i,1).value ' . . . Copy that value into the cell on Sheet2 in the row specified by our "j" variable.
    else 'If the cell is blank, then . . .
       myOtherSheet.Cells(j,2).value = "N/A" ' . . . place the text "N/A" into the cell in row "j" in Sheet2.
    end if 'NOTICE we moved the "end if" statement up a line, so that it closes the "if" statement before the "j = j + 1" statement. _
      This is because now we want to add one to the "j" variable (i.e., move to the next available row in Sheet2) regardless of whether the cell in the "codes" sheet is blank or not.
       j = j + 1 'Then we add one to the "j" variable so the next time it copies, we will be on the next available row in Sheet2.
 next i 'This triggers the end of the loop and moves on to the next value of "i".

Скопировать все непустые ячейки из одного файла в другой

Sputnik

Дата: Суббота, 14.07.2018, 05:41 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Приветствую.
Будет создан файл-шаблон. Из этого файла нужно скопировать все непустые ячейки в другой файл.
Более примитивно. В первом документе-шаблоне заполнены ячейки A1 = «Привет» и С8=»Пока». При выполнении макроса в другой xls файл в лист 1 в ячейку A1 вносится «Привет» а в C8 «Пока».Остальные ячейки второго файла должны остаться без изменений.

Предполагаемые пути решения:
Запускать цикл по документу-шаблону и находить в нём непустые ячейки
Пока только ограничил диапозон поиска:

Цитата

lLastRow = Cells.SpecialCells(xlLastCell).Row
lLastCol = Cells.SpecialCells(xlLastCell).Column

Хочу в этом диапазоне произвести поиск и создать массив с номерами всех заполненных ячеек. Нужен синтаксис. Не знаю какой создать массив для номеров, не знаю каким условием проверять. Пока придумал только:

Цитата

For i = 1 To lLastCol
For j = 1 To lLastRow
If Len(……

Также интересует вопрос по заполнению листа. Если при открытии второго документа активным становится он, то как обратиться к документу-шаблону из которого запущен макрос?
Может объявить его вначале как глобальную переменную, а потом копировать из него значения по сформированному массиву?
Нужны примеры синтаксиса, как это реализовывается на VBA?

Сообщение отредактировал SputnikСуббота, 14.07.2018, 05:42

 

Ответить

Pelena

Дата: Суббота, 14.07.2018, 07:33 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
Файл с примером помог бы в понимании проблемы


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Exo

Дата: Суббота, 14.07.2018, 14:42 |
Сообщение № 3

Группа: Заблокированные

Ранг: Новичок

Сообщений: 13


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

добрый день.
так-то можно через копи-пасте сделать.
Специальная вставка, Поставить галочку «Пропускать пустые ячейки»


А что такое вестибюль?
А что такое широкополосный интернет?

 

Ответить

Sputnik

Дата: Суббота, 14.07.2018, 16:32 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Здравствуйте.
Файл с примером помог бы в понимании проблемы

Здравствуйте, прикрепил файл.
Сейчас загвоздка в нестабильной работе. При записи

Цитата

Public thisBook As Workbook
thisBook = ThisWorkbook

происходит ощибка,

Цитата

thisBook = nothing

Хотя при первых запусках программа выполнялась.

так-то можно через копи-пасте сделать.

Добрый день.Да, делал через Select, SpecialCells, и Pastle. Мне не понравилось, почему-то вставляется весь диапазон а не только заполненные ячейки.Да время выполнения долгое.

Сообщение отредактировал SputnikСуббота, 14.07.2018, 16:36

 

Ответить

Exo

Дата: Суббота, 14.07.2018, 17:22 |
Сообщение № 5

Группа: Заблокированные

Ранг: Новичок

Сообщений: 13


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Встроенный макрос в Ваш пример позволяет перебирать все файлы в каталоге что ли?
Попробуйте просто удалить раздел «Option Explicit» из тела макроса, дальше разбираться лениво.


А что такое вестибюль?
А что такое широкополосный интернет?

Сообщение отредактировал ExoСуббота, 14.07.2018, 17:30

 

Ответить

Exo

Дата: Суббота, 14.07.2018, 17:59 |
Сообщение № 6

Группа: Заблокированные

Ранг: Новичок

Сообщений: 13


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Также интересует вопрос по заполнению листа. Если при открытии второго документа активным становится он, то как обратиться к документу-шаблону из которого запущен макрос?
Может объявить его вначале как глобальную переменную, а потом копировать из него значения по сформированному массиву?
Нужны примеры синтаксиса, как это реализовывается на VBA?

Если всё же следовать Вашему запросу, Синтаксис не сложный. Самое главное — должен быть уже создан и открыт «Новый файл.xlsm»
НО! НЕ ОН должен быть активным, а та книга. откуда пытаетесь перенести:

[vba]

Код

Sub Макрос1()

LastRow = Cells.SpecialCells(xlLastCell).Row
LastCol = Cells.SpecialCells(xlLastCell).Column
WB = ActiveWorkbook.Name ‘присваиваем имя текущей книге
WB1 = «Новый файл.xlsm» ‘присваиваем имя другой открытой книге, в которую надо перенести. «Новый файл@ — это имя уже открытой книги»
For i = 1 To LastRow
For j = 1 To LastCol
If Workbooks(WB).Sheets(«Лист1»).Cells(i, j).Value <> Empty Then
Workbooks(WB1).Sheets(«Лист1»).Cells(i, j).Value = Workbooks(WB).Sheets(«Лист1»).Cells(i, j).Value
End If
Next j
Next i

End Sub

[/vba]


А что такое вестибюль?
А что такое широкополосный интернет?

 

Ответить

KuklP

Дата: Суббота, 14.07.2018, 20:24 |
Сообщение № 7

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Глубоко не вникал, но на поверхности надо так:
[vba]

Код

Sub Get_All_File_from_SubFolders()
    Dim r As Range
    Dim FSO As Object, Folder As Object, File As Object
    Dim ws As Worksheet
    Dim sFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, «», Application.PathSeparator)

    Set FSO = CreateObject(«Scripting.FileSystemObject»)
    Set Folder = FSO.GetFolder(sFolder)    ‘тут путь к своей папке
    For Each File In Folder.Files
        If InStr(File.Name, «.xls») > 0 Then
            Set ws = Workbooks.Open(File.Path).Sheets(1)
            Get_Current_Range ws
            ws.Parent.Close -1
        End If
    Next
    Set Folder = Nothing
    Set FSO = Nothing
    MsgBox «Готово!»
    Exit Sub
End Sub

Sub Get_Current_Range(f As Worksheet)
    Dim c As Range
    Dim i As Integer
    Dim j As Integer

    k = 0
    lLastRow = f.Cells.SpecialCells(xlLastCell).Row
    lLastCol = f.Cells.SpecialCells(xlLastCell).Column
    MsgBox «lLastRow=» & lLastRow & » lLastCol=» & lLastCol

    ReDim arrOfNumber(1, 0)
    For i = 1 To lLastRow
        For j = 1 To lLastCol
            If Len(f.Cells(i, j).Value) Then
                ReDim Preserve arrOfNumber(1, k)
                arrOfNumber(0, k) = i  ‘row
                arrOfNumber(1, k) = j  ‘colum
                k = k + 1
            End If
        Next j
    Next i
    k = k — 1
    MsgBox «Всего » & k
End Sub

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

KuklP

Дата: Суббота, 14.07.2018, 20:35 |
Сообщение № 8

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Ну и конечно искать последнюю методом .Cells.SpecialCells(xlLastCell) не айс. Все форматы туда влезут.
Лучше типа этого:
[vba]

Код

Sub LastCell()
    Dim x As Range
    Set x = Cells.Find(«*», [a1], xlFormulas, 1, 1, 2)
End Sub

[/vba]
А вот SpecialCells(12) выделит непустые независимо от форматов, это «хорошие сапоги, надо брать»))


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Exo

Дата: Суббота, 14.07.2018, 20:57 |
Сообщение № 9

Группа: Заблокированные

Ранг: Новичок

Сообщений: 13


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

KuklP,
Сергей, а что Вы сможете найти с помощью SpecialCells(12)?.
Я не дебил, я просто учусь.
Скрытые тоже?


А что такое вестибюль?
А что такое широкополосный интернет?

Сообщение отредактировал ExoСуббота, 14.07.2018, 21:00

 

Ответить

Exo

Дата: Суббота, 14.07.2018, 20:59 |
Сообщение № 10

Группа: Заблокированные

Ранг: Новичок

Сообщений: 13


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

del


А что такое вестибюль?
А что такое широкополосный интернет?

Сообщение отредактировал ExoСуббота, 14.07.2018, 21:01

 

Ответить

KuklP

Дата: Суббота, 14.07.2018, 21:11 |
Сообщение № 11

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Я перепутал. Давно за Экс не садился) 12 это видимые. Надо 2 + потом еще формулы -4123 можно через Union. Но это если данные расположены непредсказуемо. Обычно же решение попроще.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

InExSu

Дата: Понедельник, 16.07.2018, 00:05 |
Сообщение № 12

Группа: Друзья

Ранг: Ветеран

Сообщений: 646


Репутация:

96

±

Замечаний:
0% ±


Excel 2010

Привет!
Задача интересная и полезная.

Набросок во вложении.

К сообщению приложен файл:

______.xlsb
(20.3 Kb)


Разработчик Битрикс24 php, Google Apps Script, VBA Excel

Сообщение отредактировал InExSuПонедельник, 16.07.2018, 00:13

 

Ответить

Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в VBA Excel. Методы Cut, Copy и PasteSpecial объекта Range, метод Paste объекта Worksheet.

Метод Range.Cut

Range.Cut – это метод, который вырезает объект Range (диапазон ячеек) в буфер обмена или перемещает его в указанное место на рабочем листе.

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена.

Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.

Метод Range.Copy

Range.Copy – это метод, который копирует объект Range (диапазон ячеек) в буфер обмена или в указанное место на рабочем листе.

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена.

Метод Worksheet.Paste

Worksheet.Paste – это метод, который вставляет содержимое буфера обмена на рабочий лист.

Синтаксис

Worksheet.Paste (Destination, Link)

Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект.
Link Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию).

В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.

Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).

Примеры

Вырезание и вставка диапазона одной строкой (перемещение):

Range(«A1:C3»).Cut Range(«E1»)

Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Range(«A1:C3»).Cut

ActiveSheet.Paste Range(«E1»)

Копирование и вставка диапазона одной строкой:

Range(«A18:C20»).Copy Range(«E18»)

Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Range(«A18:C20»).Copy

ActiveSheet.Paste Range(«E18»)

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

Range(«A1»).Copy Range(«B1:D10»)


Понравилась статья? Поделить с друзьями:
  • Excel макрос копирование значений ячеек
  • Excel макрос копирование данных с ячеек
  • Excel макрос координаты ячейки
  • Excel макрос комбинация клавиш
  • Excel макрос количество строк в таблице