Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
1

Перемещение содержимого ячейки Б в ячейку А при удалении содержимого в ячейке А

30.09.2014, 15:47. Показов 1228. Ответов 13
Метки нет (Все метки)

Суть проблемы следующая. Имеется диапазон ячеек с текстом в каждой. При выделении любой из ячеек и удалении содержимого в ней, содержимое других ячеек передвигаются вверх на место удаленной. Диапазон ячеек при этом сохраняется. Пожалуйста, подскажите как это можно реализовать. Я не разбираюсь в VB. Только на уровне прикрутить код к кнопке или запустить код с открытием книги.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2014, 15:47
Ответы с готовыми решениями:

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

Запрет удаления содержимого нескольких ячеек в строке при установке значения в ячейке
Добрый день К сожалению не смог решить сам свою задачу, прошу помощи Есть таблица excel с...

Возврат содержимого ячейки при выполнении условий
Добрый день, господа! Подскажите пожалуйста, я правда делаю таблицу в Гугл докс, но не столь...

Получение содержимого ячейки DataGridView при клике на ней
При нажатии на ячейку в DataGridView в другом PictureBox выводила кортику об этой ячейки

13
Чорумфанин
346 / 346 / 320
Регистрация: 06.03.2014
Сообщений: 899
07.10.2014, 12:10 2
Hardmemory, можно пробовать через Worksheet_Change()
Код вставляйте как на картинке.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Application.EnableEvents = False
    
    Col = Target.Column
    Row = Target.Row
    EndRow = Cells(Rows.Count, Col).End(xlUp).Row - Row
      
    If EndRow <= 0 Then GoTo err
      
    If Cells(Row, Col) = "" Then
         Cells(Row + 1, Col).Resize(EndRow, 1).Cut Cells(Row, Col)
    End If
           
err:     Application.EnableEvents = True
          
End Sub
Миниатюры
Перемещение содержимого ячейки Б в ячейку А при удалении содержимого в ячейке А  
1
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
07.10.2014, 12:59  [ТС] 3
Спасибо огромное. Я уже думал никто не откликнется. Пока ждал ответ, написал вот такой код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Button_shift_Click()
Dim i, k
For k = 1 To 13
For i = 21 To 32
 
    If Cells(i, 19).Value = "" Then
        Cells(i, 19).Value = Cells(i + 1, 19).Value
        Cells(i + 1, 19).Value = ""
 
    End If
 
Next i
Next k
End Sub
И привязал его к кнопке, пока что.
Ваш код обязательно попробую. Есть одно "но". Нужно сохранить формат содержимого. Например заливку. А то содержимое перемещается, а заливка остается на прежнем месте. В общем, еще раз спасибо, чуть позже опробую ваш код.
0
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
05.11.2014, 10:59  [ТС] 4
Ваш код почему-то не работает. Не могли бы вы посмотреть в чем дело? Все же от своих циклов я хочу отказаться, т.к. у них есть один минус.
0
Чорумфанин
346 / 346 / 320
Регистрация: 06.03.2014
Сообщений: 899
05.11.2014, 14:54 5
Hardmemory, у меня все работает. В приложении файл, попробуйте его.
Вложения
Тип файла: zip Book1.zip (11.6 Кб, 10 просмотров)
0
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
05.11.2014, 19:19  [ТС] 6
Да, действительно. Ваш код хорош и работает. Но, как его реализовать для объединенных ячеек?
0
Чорумфанин
346 / 346 / 320
Регистрация: 06.03.2014
Сообщений: 899
06.11.2014, 00:30 7
Объедененные ячейки = зло. Лучше их не использовать вообще.
0
4116 / 2221 / 939
Регистрация: 01.12.2010
Сообщений: 4,624
06.11.2014, 01:45 8
Hardmemory, Если допускается "разъединение" ячеек и изменение происходит строго в одной единственной ячейке, то можно использовать что-то вроде :

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
    If IsEmpty(Target) = True Then
       With Application
            .EnableEvents = False: .DisplayAlerts = False
             Target.Delete xlUp
            .EnableEvents = True:  .DisplayAlerts = True
       End With
    End If
End Sub
0
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
06.11.2014, 11:37  [ТС] 9
Перемещение содержимого ячейки Б в ячейку А при удалении содержимого в ячейке А


kasan, Посмотрите, пожалуйста скрин ↑. Без объединенных ячеек иногда нельзя обойтись. Ведь задачи бывают разными. "Блокнот для коротких заметок" - именно он является задачей. Я использую для него свой код, как я писал выше:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Button_shift_Click()
Dim i, k
    For k = 1 To 13
    For i = 21 To 33
    
        If Cells(i, 19).Value = "" Then
            Cells(i, 19).Value = Cells(i + 1, 19).Value
            Cells(i + 1, 19).Value = ""
 
        End If
        
    Next i
    Next k
    
    'Cells(i, 19).Interior.Color = Cells(i + 1, 19).Interior.Color'
End Sub
Но этот код примитивный, несмотря на то, что работает. Но если список (как в блокноте для коротких заметок) будет большим, начнутся тормоза и визуально это не очень хорошо будет выглядеть, т.е. цикл тогда будет большим из-за большого количества ячеек.

p.s. код я прикрутил к кнопке "Обновить заметки" - так, для справок.
0
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
06.11.2014, 11:44  [ТС] 10
pashulka, к сожалению и ваш код не подошел для задачи. Надо было мне изначально условие правильно расписать. Для объединенных ячеек код не работает.
0
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
06.11.2014, 11:59  [ТС] 11
udaljashka (2).rar

Есть еще вот такой интересный код (не мой, конечно же). Неплохо работает с объединенными ячейками, но сдвигает абсолютно все, в том числе форматирование, таблицу. В общем сдиг с разрушением как бы. Посмотрите его, пожалуйста, может быть можно его как-то подкорректировать, чтобы табличка целая оставалась.
0
4116 / 2221 / 939
Регистрация: 01.12.2010
Сообщений: 4,624
06.11.2014, 12:00 12
Hardmemory, Дык и об'единить ячейки можно по разному, поэтому, imho, лучше говорить имея на руках файл …а если продолжить гадания на кофейной гуще, то

Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
    With Application
         If .CountA(Target) = 0 Then
            .EnableEvents = False: .DisplayAlerts = False
             Target.Delete xlUp
            .EnableEvents = True:  .DisplayAlerts = True
         End If
    End With
End Sub
0
0 / 0 / 0
Регистрация: 30.09.2014
Сообщений: 12
06.11.2014, 12:12  [ТС] 13
Сдвиг объединенных ячеек.rar

pashulka, прикрепил файл. Как откроете его, нажмите на кнопку "Обновить список", чтобы сразу понятно стало, как это работает. Код мой, поэтому будет немного притормаживать. Особенно если увеличить число ячеек в таблице до, скажем, 200
Я думал, что скриншот, который я выше разместил прояснит картину. Извиняюсь.
0
4116 / 2221 / 939
Регистрация: 01.12.2010
Сообщений: 4,624
06.11.2014, 13:08 14
Ладно, если удаление ячеек не устраивает, то вот аналог Вашего макроса

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub Test()
    Dim iRow&, iCount&, iArr$(1 To 34, 1 To 1)
    
    For iRow = 4 To 37
        If Not IsEmpty(Cells(iRow, 4)) Then
           iCount = iCount + 1
           iArr(iCount, 1) = Cells(iRow, 4)
        End If
    Next
    Range("D4:D37") = iArr '[D4:D37] = iArr
End Sub
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2014, 13:08

Ошибка при преобразовании содержимого ячейки DataGrid в int
Есть DataGrid, заполненный значениями с БД. При выборе нужной строки считывается значение ячейки...

Как при экспорте делать перевод содержимого ячейки на новую строку?
Подскажите как при экспорте делать переход содержимого ячейки на новую строку, т.е. в гриде у меня...

Отправка содержимого поля в файл при нажатии кнопки без потери этого содержимого с поля
Привет всем!) Я отправляю содержимое textarea в файл при нажатии кнопки, после нажатия на кнопку...

Run time error 9 при сравнении текста в TextBox поля и содержимого ячейки
Sub stoim() Dim i As Integer For i = 2 To 33 If Sheets(&quot;Ïðàéñ-ëèñò&quot;).Cells(54, 1).Value Like...

Сделать в ячейке таблицы поле ввода на всю ячейку при возможности менять высоту ячейки
Здравствуйте, учусь html и css и никак не получается сделать в ячейке таблицы поле ввода на всю...

Есть ли такое событие DataGridView, которое возникает при изменении ВИДИМОГО содержимого ячейки?
Из названия ясно, что CellValueChanged не канает; событие должно происходить при каждом нажатии...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.