У тебя все в порядке?
# 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[]
Я записал своего рода систему сборки для 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 необходимо изменить некоторые вещи сделать это подвижным в файловой системе.Надеюсь, это поможет!
Интересный вопрос... мы также имеем проблему с управлением исходным кодом VBA, но на самом деле никогда не двигались для обращения к нему.
Эта статья Microsoft KB соответствует Вашим критериям? Код помещается в.BAS файл, который может быть в arbitary месте (и отделиться от .xls).
Как я сказал, я на самом деле никогда не пытался сделать это, но выглядит, как будто это могло бы быть одним подходом.
Я настоятельно рекомендовал бы против попытки загрузить VBA во времени выполнения. Автоматизация VBIDE облуплена в лучшем случае, и я думаю, что Вы столкнетесь с довольно большим количеством головных болей сопровождения и поддержки.
Мое решение этого состояло в том, чтобы экспортировать код peridocally для управления исходным кодом как текстовые файлы. Я также удалил бы весь код из xls (полное удаление Форм, Модулей и Модулей Класса и удаления кода в модулях Рабочего листа и Рабочей книги) и поместил бы только этот 'тупик' xls в управление исходным кодом.
Восстанавливание от управления исходным кодом было бы thereforce состоять из взятия 'тупика' xls, импорта всех Форм, Модулей Класса и Модулей и копии и вставки во всем коде в модули Рабочего листа и Рабочей книги.
Пока это было болезненным процессом, он действительно допускал надлежащее управление исходным кодом кода со всеми обычными возможностями diffing, переходя и т.д. К сожалению, большая часть из него была ручной. Я действительно писал дополнение, которое автоматизировало часть этого, но оно было быстро взломано вместе решение, т.е. довольно ошибочное и требующее ручное вмешательство. Если я когда-нибудь вернусь к пересматриванию его и получению его в хорошем состоянии затем, то я сообщу ;-)
Я думаю по сравнению с альтернативами (т.е. постоянно восстановление файлов рабочей книги Excel), это было бы намного меньше стычки для отодвижений к VSTO или COM-надстройкам, с помощью VBA для легкой работы разработки прототипа. Вы также извлекаете дополнительную пользу из не наличия легко "hackable" исходного кода (т.е. Вам нужны больше, чем предположить пароль проекта VBA),
Я также отговорил бы от загрузки во времени выполнения и искал бы утилиту делать-стиля. В конце концов, если Ваш код является объектом управления исходным кодом затем, необходимо только должны быть обновить рабочие книги после фиксации.
К сожалению, нет такой утилиты или по крайней мере не той, которую я мог найти.