Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2013, 15:24   #1
Heavyhand
 
Аватар для Heavyhand
 
Регистрация: 19.08.2013
Сообщений: 8
Смущение Вкладочный вид базы Excel

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

Если клетка пустая
Спускаемся в низ

-----
вот код программы:
Sub old()
'
' old Макрос
'
' Сочетание клавиш: Ctrl+ц
'
Dim a As Integer ' Вводим переменную
a = Selection
With Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'Вставка(смещение)
ActiveCell.Offset(1, 0).Select
Selection.Cut
ActiveCell.Offset(-1, 0).Select
ActiveSheet.Paste
End With
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False 'шрифт за границы и приравнивание налево

.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With

ActiveCell.Offset(1, 0).Select 'Спускаемся сравниваем значение с а
If Selection = a Then
Selection.ClearContents 'Удаляем если равно



If Selection <> a Then
a = Selection 'если не равно забираем значение из новой клетки
Rows("2:2").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell.Offset(1, 0).Select
Selection.Cut
ActiveCell.Offset(-1, 0).Select
ActiveSheet.Paste
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False

.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection 'шрифт, смещение
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
End
If IsEmpty(ActiveCell.Value) = True Then

ActiveCell.Offset(1, 0).Select


End If
End If
End If


End Sub


Существует 2 проблемы:
1) Цикличность. не знаю как заставить её выполнять повторения впредь до тысяч так 5
2) ошибка в коде из-за которой действующая ячейка не смещается а постоянно находится на а2, при этом сдвигая все вверх(должна реагировать на выделенную ячейку(и действовать от неё(выделенную мышкой))

Объясните пожалуйста как использовать "Rows" и как заставить двигаться от выделенной ячейки вниз
Heavyhand вне форума Ответить с цитированием
Старый 20.08.2013, 15:28   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я думаю что всё нужно делать иначе.
Но конечно если увижу файл и пойму задачу - может быть передумаю
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 20.08.2013, 15:37   #3
Heavyhand
 
Аватар для Heavyhand
 
Регистрация: 19.08.2013
Сообщений: 8
Радость

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я думаю что всё нужно делать иначе.
Но конечно если увижу файл и пойму задачу - может быть передумаю
Вот вся задача
Изображения
Тип файла: png Снимок.PNG (5.1 Кб, 104 просмотров)
Тип файла: png Снимок2.PNG (4.7 Кб, 104 просмотров)
Heavyhand вне форума Ответить с цитированием
Старый 20.08.2013, 16:18   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

полагаю этот
Код:
Sub FIxData()
  Dim r As Long
  r = 1: If Cells(r, 1) = "" Then r = Cells(r, 1).End(xlDown).Row
  Do While Cells(r, 1) <> ""
    Cells(r, 2).Resize(1, 2).Value = Cells(r + 1, 2).Resize(1, 2).Value
    Cells(r + 1, 2).Resize(1, 2).ClearContents
    r = Cells(r, 1).End(xlDown).Row
  Loop
End Sub
может реализовать Вашу задумку (даже если данных будет больше 5 тыс. строк)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 20.08.2013, 16:37   #5
Heavyhand
 
Аватар для Heavyhand
 
Регистрация: 19.08.2013
Сообщений: 8
Хорошо

Цитата:
Сообщение от IgorGO Посмотреть сообщение
полагаю этот
Код:
Sub FIxData()
  Dim r As Long
  r = 1: If Cells(r, 1) = "" Then r = Cells(r, 1).End(xlDown).Row
  Do While Cells(r, 1) <> ""
    Cells(r, 2).Resize(1, 2).Value = Cells(r + 1, 2).Resize(1, 2).Value
    Cells(r + 1, 2).Resize(1, 2).ClearContents
    r = Cells(r, 1).End(xlDown).Row
  Loop
End Sub
может реализовать Вашу задумку (даже если данных будет больше 5 тыс. строк)
действие вашей программы.
нужно что бы вставлялась строка а данные из клетки перемещались на 1 клетку вверх что бы быть "оглавлением" (повторяющиеся снизу удаляются, другие аспекты так же становятся оглавлениями)
Изображения
Тип файла: jpg Снимок.jpg (32.0 Кб, 123 просмотров)
Тип файла: png Снимок2.PNG (14.6 Кб, 99 просмотров)
Тип файла: png Снимок3.PNG (13.8 Кб, 106 просмотров)

Последний раз редактировалось Heavyhand; 20.08.2013 в 16:53.
Heavyhand вне форума Ответить с цитированием
Старый 20.08.2013, 17:14   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

однако...
Ваш код я даже не пытался анализировать.
по первой картинке стало понятно, что надо сделать
а вот по второй... четкие очертания задачи совершенно размылись и не просматриваются
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 21.08.2013, 11:11   #7
Heavyhand
 
Аватар для Heavyhand
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию вот так должна работать программа для всех столбцов

(в коде написано для одного столбца)
Изображения
Тип файла: jpg Снимок.jpg (31.0 Кб, 136 просмотров)
Тип файла: jpg Снимок2.jpg (27.7 Кб, 123 просмотров)
Тип файла: jpg Снимок3.jpg (40.5 Кб, 121 просмотров)
Тип файла: jpg Снимок4.jpg (24.4 Кб, 131 просмотров)
Heavyhand вне форума Ответить с цитированием
Старый 27.08.2013, 09:33   #8
Heavyhand
 
Аватар для Heavyhand
 
Регистрация: 19.08.2013
Сообщений: 8
По умолчанию Рабочий код

Public a As String
Public x1 As Integer
Public y1 As Integer
Public i As Integer
Public x2 As String
Public y2 As Integer


Sub old()
'
' old
'
' : Ctrl+й
'

x1 = Selection.Cells.Column
y1 = Selection.Cells.Row
x2 = ActiveCell.SpecialCells(xlLastCell) .Column
y2 = ActiveCell.SpecialCells(xlLastCell) .Row
i = y1


While i < y2 + 1

If IsEmpty(ActiveCell.Value) = True Then
ActiveCell.Offset(1, 0).Select
i = i + 1

Else




If Selection <> a Then
a = Selection
With ActiveCell.Rows("1:1").EntireRow.Se lect
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(i, x1).Select
ActiveCell.Offset(1, 0).Select
Selection.Cut
ActiveCell.Offset(-1, 0).Select
ActiveSheet.Paste
End With


With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False

.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
ActiveCell.Offset(1, 0).Select
i = i + 1
y2 = y2 + 1


Else
Selection.ClearContents
ActiveCell.Offset(1, 0).Select
i = i + 1



End If
End If
Wend

i = 0
End Sub
Heavyhand вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оболочка базы данных для excel seven123 Microsoft Office Excel 0 29.02.2012 08:43
добавление базы из excel в access Enkoff Microsoft Office Access 1 22.12.2011 13:32
в диаграмме excel можно было вбивать данные и изменять ее вид Mr_skiner Общие вопросы Delphi 1 08.06.2010 20:30
Базы данных в Excel+VBA Анна Рожкова Помощь студентам 3 04.04.2010 19:06
создание договора в ворде на основе базы в Excel mistx Microsoft Office Excel 19 17.10.2009 23:41