То, что я пытаюсь сделать, это это.

У меня есть форма информации о клиенте, с информацией, хранящейся на 1-м листе в двух столбцах, диапазон: F5: F38, M5: M33

У меня есть пустая база данных на листе 2, которую я хотел бы заполнить этими данными, начиная с C5 и заканчивая BM5

Я хочу иметь возможность назначить макрос кнопке «добавить», чтобы макрос автоматически вставлял новую строку для данных и копировал ее, позволяя пользователям использовать рабочий лист1 для заполнения!

Matt

Обновлено из совета Дэвида до сих пор. Единственная нерешенная проблема заключается в том, что при запуске сценария в столбце M есть марширующие муравьи, но сами данные не копируются. Для большей ясности на листе есть проверка данных и некоторое условное форматирование (несколько раскрывающихся опций и некоторая цветовая кодировка для ответов Y / N), я не уверен, является ли это фактором.

Dim wsDB As Worksheet
Dim wsInfo As Worksheet

Sub Main()
Set wsDB = Worksheets("DATABASE")
Set wsInfo = Worksheets("INPUT")

insertnewrow
addcolumnf
addcolumnm

End Sub
Sub insertnewrow()
'
' insertnewrow Macro

    wsDB.Rows("6:6").Insert _
        Shift:=xlDown, _
        CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
Sub addcolumnf()
'
' addcolumnf Macro

    wsInfo.Range("F5:F38").Copy
    wsDB.Range("C6:AJ6").PasteSpecial _
            Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True


End Sub
Sub addcolumnm()
'
' addcolumnm Macro
'
    Application.CutCopyMode = False
    wsInfo.Range("M5:M33").Copy
    wsDB.Range("AK6:BM6").PasteSpecial _
            Paste:=xlAllExceptBorders, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=True

End Sub
0
Matt-Kawa 22 Апр 2014 в 20:41

2 ответа

Лучший ответ

ОК. Я не совсем уверен, в чем ваша проблема, но, вероятно, связан с неквалифицированными объектными переменными. Когда вы делаете что-то вроде:

Range("A1").Select

Excel всегда интерпретирует это как принадлежащее объекту ActiveSheet. Поскольку вы полагаетесь на метод Selection, становится трудно отслеживать, что происходит, вам нужно постоянно выбирать новые объекты для правильного определения всего и т. Д.

Этого можно избежать, изменив свой код на что-то вроде:

Dim wsDB As Worksheet
Dim wsInfo As Worksheet

Sub Main()
Set wsDB = Worksheets("Database")
Set wsInfo = Worksheets("Sheet3") 'MODIFY AS NEEDED

insertnewrow
addcolumnf
addcolumnm

End Sub
Sub insertnewrow()
'
' insertnewrow Macro

    wsDB.Rows("6:6").Insert _
        Shift:=xlDown, _
        CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
Sub addcolumnf()
'
' addcolumnf Macro

    wsInfo.Range("F5:F38").Copy
    wsDB.Range("C6:AJ6").PasteSpecial _
            Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True


End Sub
Sub addcolumnm()
'
' addcolumnm Macro
'
    Application.CutCopyMode = False
    wsInfo.Range("M5:M33").Copy
    wsDB.Range("AK6:BM6").PasteSpecial _
            Paste:=xlAllExceptBorders, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=True

End Sub

После того, как я запустил это несколько раз, моя таблица «База данных» будет выглядеть, как на изображении ниже. Просто вызовите процедуру Main, которая запустит остальные три. Он всегда будет вставлять пустую строку в строку 6 и всегда копировать столбцы F и M в эту новую строку.

enter image description here

0
David Zemens 22 Апр 2014 в 17:57

Я предлагаю вам начать с инструмента, включенного в Microsoft Excel, под названием «Форма данных». Добавьте его в меню и пользуйтесь. Важно то, что вам нужно реорганизовать свои данные: в первой строке поместите заголовок (например, начиная с A1 до A ...) и данные в следующих строках. Эта организация поможет вам использовать вашу информацию с помощью сводных таблиц.

Если вы предпочитаете использовать кнопку для вызова формы, вы можете использовать этот макрос, назначенный кнопке:

Sub Macro1() Sheets("worksheet1").Select Range("A1").Select ActiveSheet.ShowDataForm End Sub

Эта ссылка расскажет вам больше об этом инструменте:

http://www.homeandlearn.co.uk/excel2007/excel2007s8p1.html

Если у вас есть знания в области программирования, я могу показать вам, как делать то, что вы хотите, используя VBA в Excel (for, while и т. Д.). Это немного сложнее.

Вот код, который вам нужен. но необходимо, чтобы C5 на листе 2 не был пустым:

Sub Macro6()
Dim Count As Long

'Copy first column
Sheets("worksheet1").Select
Range("F5:F38").Select
Selection.Copy

'Search the next row empty
Sheets("worksheet2").Select
Range("C5").Select
Selection.End(xlDown).Select
Count = ActiveCell.Cells.Row + 1

'Copy in the next empty row
Range("C" & Count).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True

'Again with the next column
'Copy second column
Sheets("worksheet1").Select
Range("M5:M33").Select
Application.CutCopyMode = False
Selection.Copy

'Copy in the same row in the second sheet
Sheets("worksheet2").Select
Range("AK" & Count).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True

End Sub
0
Necho 22 Апр 2014 в 18:43