Arhn - архитектура программирования

Флажки и массивы Excel

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

В настоящее время я использую список проверки данных, чтобы выбрать «Завершить» в ячейке завершения задачи. Когда в списке указано «Завершено», в поле «Дата завершения» автоматически будет указана «сегодняшняя» дата. Я достигаю этого с помощью простых функций в Excel.

Затем я создал код VBA, чтобы при нажатии кнопки команды он выделял определенные ячейки в строке, копировал эти ячейки, вставлял их в пустой рабочий лист, а затем очищал задачи и дату завершения ячеек.

Я получил большинство этих функций для работы, но я столкнулся с препятствием, когда Excel скопировал данные на пустой рабочий лист только в пустые строки (строка A1, A2, A3 и т. д.). Я не уверен, как заставить код копировать данные в пустые строки. Я знаю, что это может быть достигнуто с помощью переменной (i) и циклов.

Мой другой вопрос заключался в том, что я изначально хотел использовать флажки вместо проверенного списка, но, похоже, у меня возникли проблемы с форматированием флажков. Если мой размер строки должен измениться, чтобы соответствовать тексту, флажки будут переполнять другие ячейки. Это просто недостаток форм/activeX в Excel или я упускаю часть более широкой картины?

Я попытался использовать массив, чтобы проверить столбец «Задача завершена», а не отдельные операторы If, чтобы добавить дату. Прикреплен пример моего кода:

Dim pjt As Worksheet
Dim datawks As Worksheet
Dim myBook As Workbook  'define worksheets and workboook
Set myBook = Excel.ActiveWorkbook
Set pjt = myBook.Sheets("Project Tracker")
Set datawks = myBook.Sheets("DATA")

Dim tskarray(16) As String
     tskarray(0) = Range("K4")
     tskarray(1) = Range("k5")
     tskarray(2) = Range("k6")
     tskarray(3) = Range("k7")
     tskarray(4) = Range("k8")
     tskarray(5) = Range("k9")
     tskarray(6) = Range("k10")
     tskarray(7) = Range("k11")
     tskarray(8) = Range("k12")
     tskarray(9) = Range("k13")
     tskarray(10) = Range("k14")
     tskarray(11) = Range("k15")
     tskarray(12) = Range("k16")
     tskarray(13) = Range("k17")
     tskarray(14) = Range("k18")
     tskarray(15) = Range("k19")
     tskarray(16) = Range("k20")


        If tskarray(0) = "Complete" Then
            Range("A4,B4,D4,F4,G4,J4,L4").Select
            Selection.Copy
            datawks.Select
            datawks.Cells(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks _
                :=False, Transpose:=False
            Sheets("Project Tracker").Select
            Application.CutCopyMode = False
            pjt.Range("J4,K4").Select
            Selection.ClearContents

        Else
        Debug.Print ("No Task to Complete")
        End If
28.04.2020

  • Вы пытаетесь проверить ячейки с K4 по K20 на наличие слова Complete? 28.04.2020
  • Взгляните на команды Range.Offest и Range.End. Я думаю, что они то, что вы ищете. Кроме того, вы также можете установить переменную диапазона вместо использования массивов или (что более важно) вместо выбора диапазона. Похоже, ты из тех парней, которые ценят самосовершенствование, так что вперед. Если вы обнаружите какие-либо трудности или предпочитаете полный пример, просто скажите «пожалуйста». Я буду рад написать для вас код, полный заметок. 28.04.2020
  • Не могли бы вы уточнить, что вы подразумеваете под кодом, копирующим данные в пустые строки? Кстати, вы можете назначить диапазон массиву в одной строке. 28.04.2020
  • @dwirony - Да проверяет K4-K20 Complete, а затем заполняет ячейку рядом с ним текущей датой. 29.04.2020
  • @evilbluemonkey Спасибо за совет, я обязательно изучу эти команды. Я не против некоторого примера кода, который я могу использовать в качестве ссылки. Я чувствую, что мне легче читать код, чем писать его. 29.04.2020
  • @SJR извините за путаницу. Я просто хочу взять данные из определенных ячеек (a, b, c, d, f, g, j, l) и поместить эти данные на лист. Когда новые данные вводятся на этот лист, они просто помещаются ниже последних введенных данных. . 29.04.2020

Ответы:


1

Я считаю, что это выполнит вашу задачу (по крайней мере, на ваш вопрос), включив упомянутые вами циклы.

Dim tskarray() As String
ReDim tskarray(0 To 16)
Dim ArrayElementCount As Long
Dim RowCount As Long
RowCount = 3 'this will increment by 1 at the start of the loop so after the last iteration it will end at 16 not 17

For ArrayElementCount = 0 To UBound(tskarray)
    RowCount = RowCount + 1
    tskarray(ArrayElementCount) = pjt.Range("K" & RowCount) 'Assuming on pjt sheet.
Next ArrayElementCount

Dim TargetCell As Range
Dim LastRow As Long
RowCount = 3
For ArrayElementCount = 0 To UBound(tskarray)
    RowCount = RowCount + 1
    If tskarray(ArrayElementCount) = "Complete" Then
        For Each TargetCell In pjt.Range("A" & RowCount & ": L" & RowCount) 'Also assuming on pjt sheet
        If TargetCell.Column = 3 Or TargetCell.Column = 5 Or TargetCell.Column = 8 Or TargetCell.Column = 9 Or TargetCell.Column = 11 Then
                'Ignore columns C, E, H, I and K
            Else
                With datawks
                    LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
                    .Cells(LastRow, 1).Value = TargetCell.Value
                End With
            End If
        Next TargetCell
        pjt.Range("J" & RowCount & ":K" & RowCount).ClearContents 'Change the column letters if the range should be bigger. 
    Else
        Debug.Print ("No Task to Complete")
    End If
Next ArrayElementCount
29.04.2020
  • Это было очень полезно. Возможность пройтись по этому коду и увидеть результаты действительно помогла пролить свет на то, как работают циклы. 29.04.2020
  • Поэтому я изменил код, чтобы применить TargetCell.Value по всей строке, а не по столбцу. Я использовал .Cells(1, LastCol).Value = TargetCell.Value для достижения этой цели. Затем я хочу перейти к следующей строке, например, как функционировал .Cells(LastRow, 1).Value, но только после того, как будут введены все данные из строки рабочего листа pjt. Так, например, строка 4 с исключенными ячейками получает входные данные для строки 2 данных. Затем строка 5 pjt получает вход в строку 3 datawks. 29.04.2020
  • Если вы хотите, чтобы он продолжал уменьшать строки с каждой итерацией (при необходимости), добавьте последнюю строку обратно, поэтому .Cells(LastRow, LastCol).Value = TargetCell.Value. Если вы записываете значения вдоль строки, и она всегда будет иметь одинаковую длину ячеек (например, это означает, что столбец G всегда является последним), вы можете установить последнюю строку на основе этого столбца, а не столбца A. , таким образом, вы все еще можете присвоить его значение в том же месте, что и мой код, но он не приведет к пропуску целой строки после того, как вы поместите значение в столбец A. 29.04.2020

  • 2

    Итак, с помощью всех участников этой ветки, особенно @Samuel Everson и нескольких домашних друзей, я смог заставить свой код работать, как задумано. Я хотел опубликовать рабочий код для совета по улучшению или для других, у которых могут быть подобные проблемы. Код выглядит следующим образом:

    Dim LastRow As Long
    Dim LastCol As Long
    Dim i As Integer
    Dim j As Range
    
    
    RowCount = 3
    ColCount = 3
    i = 1
    Set j = Range("a1").End(xlDown)
    
        For ArrayCount = LBound(tskarray) To UBound(tskarray)
            RowCount = RowCount + 1
            ColCount = ColCount + 1
    
                If tskarray(ArrayCount) = "Complete" Then
                    Do While i < 7
                    For Each TargetCell In pjt.Range("A" & RowCount & ": L" & RowCount)
                        If TargetCell.Column = 3 Or TargetCell.Column = 5 Or TargetCell.Column = 8 Or TargetCell.Column = 9 Or TargetCell.Column = 11 Then
    
                        Else
    
                            With datawks
                             .Range("A1").End(xlUp).Offset(j, i) = TargetCell.Value
                             i = i + 1
    
                            End With
    
                        End If
    
            Next TargetCell
            j = j + 1
            Loop
            i = 1
            'pjt.Range("J" & RowCount & ":K" & RowCount).ClearContents
            End If
            Next ArrayCount
    
    30.04.2020
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..