Существует ли тактическое (чтение 'взлом') решение постараться не иметь код VBA и лист Excel как один двоичный файл?

У тебя все в порядке?

# dummy data, using data.table package, converting from tibble
library(data.table)
library(tibble)
library(gtools)
df <- tibble(id = rep(c("id1", "id2", "id3"), each=3),
             X1 = c("a", "f", "b",
                    "b", "a", "e",
                    "a", "f", "f"))
dt <- as.data.table(df)
dt[]

# retaining data structure
out1 <- dt[, .(unique.X1 = unique(X1)), by = id]
out1[]
# as a list
out2 <- dt[, .(unique.X1 = list(unique(X1))), by = id]
out2[]

# back to original format
out2.df <- as.tibble(out2)
out2.df

# EDIT: getting unique combinations
ids <- unique(df$id)
lookup <- as.data.table(gtools::combinations(length(ids), 2))
lookup[, V1 := ids[lookup$V1]][, V2 := ids[lookup$V2]]
setnames(lookup, c("V1", "V2"), c("ID1", "ID2"))
lookup[, index := .I]
setkey(dt, id)
joined <- lookup[, .(intersect = list(intersect(dt[J(ID1), X1], dt[J(ID2), X1]))), by=index]
out <- merge(joined, lookup, by="index")
out[, index := NULL]
out[]
6
задан ng5000 12 February 2009 в 09:56
поделиться

5 ответов

Я записал своего рода систему сборки для Excel, который импортирует код VBA из исходных файлов (который может затем быть импортирован в управление исходным кодом, diffed, и т.д.). Это работает путем создания нового файла Excel, который содержит импортированный код, таким образом, это не могло бы работать в случае.

Макрос сборки похож на это, я сохраняю его в файле под названием Build.xls:

Sub Build()
    Dim path As String
    path = "excelfiles"

    Dim vbaProject As VBIDE.VBProject
    Set vbaProject = ThisWorkbook.VBProject

    ChDir "C:\Excel"
    ' Below are the files that are imported
    vbaProject.VBComponents.Import (path & "\something.frm")
    vbaProject.VBComponents.Import (path & "\somethingelse.frm")

    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs "Output.xls"
    Application.DisplayAlerts = True

    Application.Quit
End Sub

Теперь, материал VBIDE означает, что необходимо импортировать ссылку, названную “Microsoft Visual Basic для Расширяемости Приложений 5,3 дюймов, я думаю.

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

currentPath = CreateObject("Scripting.FileSystemObject") _
    .GetAbsolutePathName(".")
filePath = currentPath & "\" & "Build.xls"

Dim objXL
Set objXL = CreateObject("Excel.Application")
With objXL
    .Workbooks.Open(filePath)
    .Application.Run "Build.Build"
End With
Set objXL = Nothing

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

12
ответ дан 8 December 2019 в 13:50
поделиться

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

Эта статья Microsoft KB соответствует Вашим критериям? Код помещается в.BAS файл, который может быть в arbitary месте (и отделиться от .xls).

Как я сказал, я на самом деле никогда не пытался сделать это, но выглядит, как будто это могло бы быть одним подходом.

1
ответ дан 8 December 2019 в 13:50
поделиться

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

Мое решение этого состояло в том, чтобы экспортировать код peridocally для управления исходным кодом как текстовые файлы. Я также удалил бы весь код из xls (полное удаление Форм, Модулей и Модулей Класса и удаления кода в модулях Рабочего листа и Рабочей книги) и поместил бы только этот 'тупик' xls в управление исходным кодом.

Восстанавливание от управления исходным кодом было бы thereforce состоять из взятия 'тупика' xls, импорта всех Форм, Модулей Класса и Модулей и копии и вставки во всем коде в модули Рабочего листа и Рабочей книги.

Пока это было болезненным процессом, он действительно допускал надлежащее управление исходным кодом кода со всеми обычными возможностями diffing, переходя и т.д. К сожалению, большая часть из него была ручной. Я действительно писал дополнение, которое автоматизировало часть этого, но оно было быстро взломано вместе решение, т.е. довольно ошибочное и требующее ручное вмешательство. Если я когда-нибудь вернусь к пересматриванию его и получению его в хорошем состоянии затем, то я сообщу ;-)

3
ответ дан 8 December 2019 в 13:50
поделиться

Я думаю по сравнению с альтернативами (т.е. постоянно восстановление файлов рабочей книги Excel), это было бы намного меньше стычки для отодвижений к VSTO или COM-надстройкам, с помощью VBA для легкой работы разработки прототипа. Вы также извлекаете дополнительную пользу из не наличия легко "hackable" исходного кода (т.е. Вам нужны больше, чем предположить пароль проекта VBA),

0
ответ дан 8 December 2019 в 13:50
поделиться

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

К сожалению, нет такой утилиты или по крайней мере не той, которую я мог найти.

0
ответ дан 8 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: