Портирование VBA на IronPython - PullRequest
0 голосов
/ 07 июня 2011

Я пытаюсь перевести код VBA, найденный в по этой ссылке , в IronPython. Кто-нибудь может порекомендовать хороший ресурс VBA, чтобы объяснить, как лучше всего это сделать для программиста на Python?

У меня реализованы все части Excel, такие как обработка и использование объектов, рабочие книги, рабочие таблицы и т. Д.

Я также остановлюсь на объяснении этого фрагмента кода:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Put the index value of the sheet into Arr. Ensure there
' are no duplicates. If Arr(N) is not zero, we've already
' loaded that element of Arr and thus have duplicate sheet
' names.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If Arr(N) > 0 Then
    ErrorText = "Duplicate worksheet name in NameArray."
    SortWorksheetsByNameArray = False
    Exit Function
End If

почему Arr (N) НЕ будет больше 0?

Вот мой текущий код, который не работает:

def move_worksheets_according_to_list(self, name_list):
    wb = self.com_workbook
    temp_list = []
    for n in range(len(name_list)):
        if name_list.count(name_list[n]) > 1:
            raise Exception("Duplicate worksheet name in NameArray.")
        else:
            temp_list.append(wb.Worksheets(name_list[n]).Index)

    for m in range(len(temp_list)):
        for n in range(m, len(temp_list)):
            if temp_list[n] < temp_list[m]:
                l = temp_list[n]
                temp_list[n] = temp_list[m]
                temp_list[m] = l

    if not all(temp_list[i] <= temp_list[i+1] for i in xrange(len(temp_list)-1)):
        return False

    print "current order"
    for sheet in wb.Worksheets:
        print sheet.Name
    wb.Worksheets(name_list[0]).Move(Before=wb.Worksheets(1))
    #WB.Worksheets(NameArray(LBound(NameArray))).Move before:=WB.Worksheets(Arr(1))
    for n in range(len(name_list)-1):
        print 'moving ', name_list[n], 'before ', name_list[n+1]
        wb.Worksheets(name_list[n]).Move(Before=wb.Worksheets(name_list[n + 1]))

Примечание:

С ответом , вот все, что мне нужно было сделать:

def move_worksheets_according_to_list(self, name_list):
    wb = self.com_workbook
    l = []
    # since wb.Worksheets is a com_object, you can't use the "if _ in XXX"
    # construct without converting to a list first
    for s in wb.Worksheets:
        l.append(s.Name)

    for n in range(len(name_list)):
        if name_list[n] in l:
            wb.Worksheets(name_list[n]).Move(After=wb.Worksheets(wb.Worksheets.Count))

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Объявление и определение размера массива long в VBA создаст массив со значением по умолчанию 0 в каждом слоте.

0 голосов
/ 21 июля 2011

def move_worksheets_according_to_list (self, name_list): wb = self.com_workbook l = [] #, так как wb.Worksheets является com_object, вы не можете использовать конструкцию "if _ in XXX" # без преобразования сначала в список дляs в wb.Worksheets: l.append (s.Name)

for n in range(len(name_list)):
    if name_list[n] in l:
        wb.Worksheets(name_list[n]).Move(After=wb.Worksheets(wb.Worksheets.Count)
...