2011-12-14 2 views
0

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

If ComboBox1.SelectedIndex = 1 Then 
     swEV2.Stop() 
     If ComboBox3.SelectedIndex = 0 Then 
      xlWorkSheet202.Activate() 
      xlWorkSheet202.Cells((AT + 2), 3) = TextBox1.Text 
      xlWorkSheet202.Cells((AT + 3), 2) = "PSS (kBs)" 
      xlWorkSheet202.Cells((AT + 3), 3) = "USS (kBs)" 
      xlWorkSheet202.Cells((AT + 3), 4) = "User %" 
      xlWorkSheet202.Cells((AT + 3), 5) = "Kernel %" 
      xlWorkSheet202.Cells((AT + 3), 6) = "Total %" 
      xlWorkSheet202.Cells((AT + 4), 1) = "Min:" 
      xlWorkSheet202.Cells((AT + 5), 1) = "Max:" 
      xlWorkSheet202.Cells((AT + 6), 1) = "Average:" 
      xlWorkSheet202.Cells((AT + 7), 1) = "Median:" 
      xlWorkSheet202.Cells((AT + 8), 1) = "Stan Dev:" 
     ElseIf ComboBox3.SelectedIndex = 2 Then 
      xlWorkSheet204.Cells((WT + 2), 3) = TextBox1.Text 
      xlWorkSheet204.Cells((WT + 3), 2) = "PSS (kBs)" 
      xlWorkSheet204.Cells((WT + 3), 3) = "USS (kBs)" 
      xlWorkSheet204.Cells((WT + 3), 4) = "User %" 
      xlWorkSheet204.Cells((WT + 3), 5) = "Kernel %" 
      xlWorkSheet204.Cells((WT + 3), 6) = "Total %" 
      xlWorkSheet204.Cells((WT + 4), 1) = "Min:" 
      xlWorkSheet204.Cells((WT + 5), 1) = "Max:" 
      xlWorkSheet204.Cells((WT + 6), 1) = "Average:" 
      xlWorkSheet204.Cells((WT + 7), 1) = "Median:" 
      xlWorkSheet204.Cells((WT + 8), 1) = "Stan Dev:" 

Это продолжается более 3 раза в нескольких разных местах ... Итак, теперь я пытаюсь реорганизовать код, чтобы сделать его более чистым и коротким.

То, что я хотел бы сделать это:

If ComboBox1.SelectedIndex = 1 Then 
     swEV2.Stop() 
     If ComboBox3.SelectedIndex = 0 Then 
      Excelupdate(xlWorkSheet203, AT) 
     ElseIf ComboBox3.SelectedIndex = 2 Then 
      Excelupdate(xlWorkSheet204, WT) 

    Private sub ExcelUpdate(byref worksheet as object, byref update as string) 

     worksheet.Activate() 
     worksheet.Cells((update + 2), 3) = TextBox1.Text 
     worksheet.Cells((update + 3), 2) = "PSS (kBs)" 
     worksheet.Cells((update + 3), 3) = "USS (kBs)" 
     worksheet.Cells((update + 3), 4) = "User %" 
     worksheet.Cells((update + 3), 5) = "Kernel %" 
     worksheet.Cells((update + 3), 6) = "Total %" 
     worksheet.Cells((update + 4), 1) = "Min:" 
     worksheet.Cells((update + 5), 1) = "Max:" 
     worksheet.Cells((update + 6), 1) = "Average:" 
     worksheet.Cells((update + 7), 1) = "Median:" 
     worksheet.Cells((update + 8), 1) = "Stan Dev:" 
    end sub 

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

Спасибо Ребята

............... ........................................

Редактировать (Извините, эти поля для комментариев ужасны для написания чего-либо)

........................................ ...............

Хорошо Я попытался изменить эти строки кода:

 If ComboBox2.SelectedIndex = 1 Then 
      If ComboBox3.SelectedIndex = 0 Then 
       ExcelUpdate(xlWorkSheet202, AT, CDbl(Pvalue), CDbl(uvalue), CDbl(UserRx.Match(line).Value), CDbl(KernelRx.Match(line).Value)) 
      ElseIf ComboBox3.SelectedIndex = 1 Then 
       ExcelUpdate(xlWorkSheet203, GT, CDbl(Pvalue), CDbl(uvalue), CDbl(UserRx.Match(line).Value), CDbl(KernelRx.Match(line).Value)) 
      ElseIf ComboBox3.SelectedIndex = 2 Then 
       ExcelUpdate(xlWorkSheet204, WT, CDbl(Pvalue), CDbl(uvalue), CDbl(UserRx.Match(line).Value), CDbl(KernelRx.Match(line).Value)) 
      ElseIf ComboBox3.SelectedIndex = 3 Then 
       ExcelUpdate(xlWorkSheet205, OT, CDbl(Pvalue), CDbl(uvalue), CDbl(UserRx.Match(line).Value), CDbl(KernelRx.Match(line).Value)) 
      End If 
     End If 

Private Sub ExcelUpdate(ByVal Sheet As Object, ByVal update As Integer, ByVal pval As Double, ByVal uval As Double, ByVal user As Double, ByVal kernel As Double) 
    update = update + 1 
    Sheet.cells(update, 1) = timenow 
    Sheet.cells(update, 2) = pval 
    Sheet.cells(update, 3) = uval 
    Sheet.cells(update, 4) = user 
    Sheet.cells(update, 5) = kernel 
    Sheet.cells(update, 6) = cdbl(kernel + User) 
end sub 

Но листы excel по-прежнему не обновляются с новой информацией. Есть ли что-нибудь еще, что им не хватает?

ответ

0

Я хотел бы проверить/изменить пару вещей:

1) Измените ByRefs в функции к ByVal. Вам не нужно обновлять ссылку на рабочий лист или изменять строку, поэтому ByRef не требуется.

2) Определите тип данных параметра обновления. Вы смешиваете операции и типы, что может привести к неправильной ссылке на ячейки.

Если цель ссылки ячейки является:

worksheet.Cells(("A2"), 3) 

, то вы должны изменить свой код:

worksheet.Cells((update & "2"), 3) 

Если цель ссылки ячейки является:

worksheet.Cells((12), 3) 

, то вы должны изменить тип параметра обновления:

update as integer 
+0

В чем разница между byval и byref, и когда я буду использовать byref? и цель «12», поэтому я попытаюсь изменить ее на целое число – Nefariis

+0

Передача аргумента ByRef означает, что процедура может изменять передаваемую переменную. Для объектов это означает, что вы можете установить значение Nothing или создать новый экземпляр , Для строк это означает, что вы можете изменить значение строки, и она вернется к вызывающему. ByVal означает, что вы передаете объект по значению. Для объектов вы можете изменять или получать доступ к свойствам объекта, но не самому объекту. Для строк это означает, что вы можете изменить строку, которая вам нужна в процедуре, но она не повлияет на переменную в области вызова. –

+0

Я отправил * edit * в исходный код в вышеуказанном поле вопроса, я думаю, что его проще писать код там, а в поле комментариев – Nefariis

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