2017-01-03 8 views
-3

У меня есть база данных, объединяющая все проекты в моем подразделении, которые постоянно обновляются.Создание VBA для фильтрации базы данных и разделения ее на таблицы на основе идентификатора проекта для отчетности?

база данных состоит из 4-х колонок:

  1. Дата обновления по
  2. Название проекта
  3. Ссылка
  4. Статус

Давайте предположим, что у нас есть 4 проектов.

Я хочу VBA, который принимает все обновления для каждого проекта и имеет его в одной таблице.

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

Новые 4 таблицы будет состоять из 3-х колонок

  1. Дата
  2. Reference
  3. Статус

(название проекта будет общим, поэтому он удален в новых таблицах и это будет заглавие для каждой таблицы)

Таким образом, номер проекта будет основным критерием поиска для VBA.

Информация о базе данных заполняется пользовательской формой, пользовательская форма вставляет все обновления этой базы данных. Именно по этой причине я хочу разбить базу данных на таблицы на основе идентификатора проекта. Поскольку данные вводятся с использованием пользовательской формы, Пользователь будет выбирать проект, который он хочет обновить, по встроенному раскрывающемуся списку в пользовательской форме, а затем после отправки пользовательская форма введет введенные данные в базу данных.

Основная цель этого запроса иметь печатный отчет, объединив все проекты, но каждый проект будет находиться в отдельной таблице для облегчения отчета analysis.Sub()

Sheet4.Activate 


Dim project1 As String 
Dim project2 As String 
Dim project3 As String 
Dim project4 As String 
Dim project5 As String 
Dim project6 As String 
Dim project7 As String 
Dim project8 As String 
Dim project9 As String 
Dim project10 As String 
Dim project11 As String 
Dim project12 As String 
Dim project13 As String 
Dim project14 As String 
Dim project15 As String 

Dim finalrow As Integer 

Dim i As Integer 

project1 = Sheet4.Range("U1").Value 
project2 = Sheet4.Range("U2").Value 
project3 = Sheet4.Range("U3").Value 
project4 = Sheet4.Range("U4").Value 
project5 = Sheet4.Range("U5").Value 
project6 = Sheet4.Range("U6").Value 
project7 = Sheet4.Range("U7").Value 
project8 = Sheet4.Range("U8").Value 
project9 = Sheet4.Range("U9").Value 
project10 = Sheet4.Range("U10").Value 
project11 = Sheet4.Range("U11").Value 
project12 = Sheet4.Range("U12").Value 
project13 = Sheet4.Range("U13").Value 
project14 = Sheet4.Range("U14").Value 
project15 = Sheet4.Range("U15").Value 


finalrow = Sheet4.Range("A2000").End(xlUp).Row 

i = 0 

For i = 1 To finalrow 
If Cells(i, 1) = project1 Then 
Sheet7.Range("A100").End(xlUp).Offset(1, 0) = project1 


    If Cells(i, 1) = project1 Then 
      Sheet4.Range(Sheet4.Cells(i, 2), Sheet4.Cells(i, 8)).Copy 
      Sheet7.Range("A100").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValuesAndNumberFormats 

    End If 
End If 

Next i 



Sheet7.Activate 





End Sub 
+5

В максимально возможной степени; этот сайт для вопросов ... Что твой? – User632716

ответ

0

Вы не поставили код , поэтому я тоже не стану. Идея проста:

  • создать список проектов. Если вы знаете, что есть 4, вы можете использовать его как фиксированный параметр, но он уродливый, лучше посчитайте их
  • подсчитайте линии, которые вы собираетесь на каждый проект
  • создать массив массивов (redim A (от 1 до 4), вы можете сделать это в VBA)
  • для каждого проекта, Redim нового массива нужного размера и заполнить его правильно
  • петли на проектах и ​​вставлять весь массив в удобном рабочем листе

Удачи и не стесняйтесь возвращаться, если у вас есть трудности с этим!

после вашего издания: попробуйте использовать массивы:

Dim projectList() As String 
projectList= Range(Sheet4.Range("U1"),Sheet4.Range("U1").end(xldown)).Value2 

Количество проектов будет UBOUND (projectlist)

О цикле: вы используете петлю на клетки, которые ужасно много времени. Я предлагаю вам использовать:

finalrow = Sheet4.Range("A2000").End(xlUp).Row 
dim data() 
data=range(Sheet4.Range("A1),Sheet4.Range("A" & finalrow)).value2 

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

Удачи :-)

+0

Спасибо, ребята, за отзыв! Возможно, я не мог правильно объяснить свой вопрос. Идея создания новых таблиц для каждого проекта предназначена для отчетности. Если бы я хотел составить ежемесячный отчет для всех проектов, мне нужно, чтобы каждый проект находился в отдельной таблице, поэтому будет легче сообщать. В противном случае я бы напечатал всю базу данных, но не представляю для нее никакой информации. – Keem

+0

@Keem: это место не «код для меня». Попробуйте сделать код (например, как я предложил), а затем вернуться к нам. – Pierre

+0

Прошу прощения, если вы меня неправильно поняли, я не ребята, чтобы написать весь код для меня. Но я новичок в VBA, и я хочу знать, возможно ли это? и каковы коды, которые я должен использовать для объединения информации. для того, что вы предложили в пункте 2 пули, я не могу определить, сколько строк у меня будет в каждом проекте, поскольку база данных постоянно обновляется. в некоторых проектах будет 10, у кого-то будет 3. – Keem

0

Из того, что я могу прочитать здесь и относительно точки зрения базы данных, это не имеет особого смысла создавать новую таблицу для каждого проекта. Это просто усложняет процесс кодирования.

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

+0

Спасибо, ребята, за отзыв! Возможно, я не мог правильно объяснить свой вопрос. Идея создания новых таблиц для каждого проекта предназначена для отчетности. Если бы я хотел составить ежемесячный отчет для всех проектов, мне нужно, чтобы каждый проект находился в отдельной таблице, поэтому будет легче сообщать. В противном случае я бы напечатал всю базу данных, но не представляю для нее никакой информации. – Keem