2017-02-16 8 views
3

Это вопрос до this вопросов.Последующее наблюдение за наложением VBA через конструкцию, конструктор не работает?

Вот мой прецедент: я хочу сравнить два файла Excel по ячейкам и выделить ячейки, которые отличаются друг от друга. Каждый файл будет иметь несколько листов, и каждый лист будет содержать несколько столбцов, каждый из которых имеет заголовок и несколько значений (как обычно). Вот мой проект Диаграмма деятельности для кода сравнения:

Activity Diagram

А вот мой проект диаграммы классов:

Class Diagram

Моя цель состоит в том, чтобы сделать VBA менее обременительным для типов вещей Я часто (например, сравнение новых и старых версий электронных таблиц). То есть, я хочу, чтобы работать как Python ... В частности, я хочу, чтобы написать такой код:

For Each Sheet1 In File1 
    Name1 = Sheet1.Name 
    If File2.sheet_dict.Exists(Name1) Then 
     Sheet2 = File1.Sheets(File2.sheet_dict(Name1)) 
     Sheet2.Checked = True 
     For Each Col1 In Sheet1.cols 
      hdr = Col1.Header 
      If Sheet2.header_dict.Exists(hdr) Then 
       Col2 = Sheet2.cols(Sheet2.header_dict(hdr)) 
       Col2.Checked = True 
       For Each Val1 In Col1.Vals 
        Val2 = Col2.Vals(Val1.row_number) 
        Val2.Checked = True 
        If Not Val1.Match(Val2) Then 
         Val1.formatBad() 
         Val2.formatBad() 
        End If 
       Next Val1 
       For Each Val2 In Col2.Vals 
        If Not Val2.Checked Then 
         Val2.formatBad 
        End If 
       Next Val2 
      Else 
       Col1.formatBad() 
      End If 
     Next Col1 
     For Each Col2 In File2.cols 
      If Not Col2.Checked Then 
       Col2.formatBad 
      End If 
     Next Col2 
    Else 
     Sheet1.formatBad() 
    End If 
Next Sheet1 

For Each Sheet2 In File2 
    If Not Sheet2.Checked Then 
     Sheet2.formatBad() 
    End If 
Next Sheet2 

Конечно, я бы загружать все данные в объекты первого, но вы получите идея. Это безумие, чтобы попытаться сделать что-то подобное в VBA?

+0

Hi again :). На мой взгляд, вы каким-то образом переписываете модель COM-класса Excel по-своему, и это недостаточно оправдано. Если вы хотите упростить или добавить некоторые операции, которые недостаточно присутствуют в модели, такие как 'Sheet_Exists (..), Header_Exists (..)' и т. Д., Я бы пошел с обогащением модели своим собственным дополнительным набором но не переписывая модель класса. –

+0

Знаете ли вы хорошую диаграмму модели COM класса Excel? Я стараюсь избегать использования запутанного способа, который обычно используется для итерации по ячейкам в диапазоне (для меня, как правило, над столбцами, а затем над значениями в столбце). Я никогда не помню, как получить последнюю строку в столбце, последнем столбце в строке и т. Д. Я написал для них функции, но это просто так неинтуитивно. Я думал, что этот код в классе упростит процесс. Неужели я ошибаюсь? –

+0

Я не имею его в графическом или UML-формате. [Это] (https://msdn.microsoft.com/en-us/library/office/ff194068.aspx) является руководством для объектной модели Excel. Я нашел графику для * маленькой части * модели [здесь] (https://powerspreadsheets.com/excel-vba-object-model/) –

ответ

1

Это не сумасшедший, чтобы хотеть использовать объектно-ориентированный язык функции VBA, но использование случае вы даете не , что далеко от встроенных объектов, которые выделяются уже обеспечивает и поэтому ISN» t ясно, сколько вы получите получить от сложности, которую вы будете добавлять, чтобы получить его. Есть яркий кусок энергии, который нужно использовать в excel vba, но это , чтобы играть в сильные стороны, когда можете.

Вы можете так же легко раскрасить отличаясь клетки более эффективно с помощью кода в конце этого поста - явно не делать все, что вы собираетесь, но ясно то, что не требует прибегать к ОО для одного столбцов и строк.

Excel и vba сильно отличаются от того, что программисты используются для получения чего-то вроде python, которые обеспечивают полное наследование классов . С VBA вы застряли, имея только наследование интерфейса , что позволит вам повторно использовать код. Но , если вы не будете осторожны, вы можете очень легко получить много кода-заглушки, который вы должны скопировать из класса в класс, чтобы быть , способным удовлетворить интерфейс, который вы хотите реализовать в своих классах.

Там же еще одна вещь, которую вы определенно должны обернуть вокруг головы, идущий от обычного языка OO и это сколько данных при репликации в ваших объектов в памяти, а не просто выходить на рабочего листа и доступа к ним, как обязательный. Есть естественная тенденция, чтобы хотеть загружать все в объект и манипулировать оттуда - но это настояние, вы должны действительно подумать дважды о в этой среде.

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

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

По возможности вы должны использовать диапазоны для ссылок на разделы на одном и том же рабочем листе и на других. Названные диапазоны - ваш друг здесь. Данные проверенные списки также очень полезны для непрерывных данных и должны использоваться по возможности, так как они очень эффективны в том, что они делают. Для несмежных наборов данных, которые ограничены по размеру, вы можете использовать комбинированные поля ActiveX , которые могут ссылаться на экземпляры объектов в памяти, если их обработчики событий переданы идентификатор, уникальный для последнего.

При проверке изменений событий вы должны быть осторожны с опросом Worksheet_Change , в котором вы увидите множество примеров из Интернета. Это может быть пожевать немного времени, если вы не будете осторожны.

Подводя итог: используйте любую мощность, которую вы можете использовать от excel, и воздержитесь от повторного изобретательства колес.

' Compares the sheet 1 of the workbook you're in 
' with sheet1 of the workbook file in 'Filename' 
' and colors the cells that differ between the two. 
Sub compare_workbooks_sheet1() 
    Dim Filename As String 
    Filename = "C:\MyBook.xlsm" 

    Dim wrkbk1 As Workbook 
    Set wrkbk1 = Workbooks.Open(Filename:=Filename) 

    Dim sht1 As Worksheet ' worksheet you're in 
    Dim sht2 As Worksheet ' worksheet you've opened to compare 
    Set sht1 = wrkbk1.Worksheets("Sheet1") 
    Set sht2 = ThisWorkbook.Worksheets("Sheet1") 

    Dim row As Long, col As Long 
    With sht2 
     For row = 1 To sht1.UsedRange.Rows.Count 
      For col = 1 To sht1.UsedRange.Columns.Count 
       If sht1.Cells(row, col) <> sht2.Cells(row, col) Then 
        .Cells(row, col).Interior.ColorIndex = 5 
       End If 
      Next 
     Next 
    End With 

    wrkbk1.Close 

End Sub 

 Смежные вопросы

  • Нет связанных вопросов^_^