none
Как на vbscript написать код вставки в ячейку страницы Excel формулы суммы всех прилегающих справа ячеек вплоть до последней заполненной? RRS feed

  • Вопрос

  • Пишу на vbscript скрипт обработки таблицы Excel. Первые строка и столбец таблицы заголовки, остальное данные.

    Хочу вставить в ячейки второй колонки (Range("B:B")) сумму значений всех ячеек, находящихся справа от текущей. Нашёл в MSDN Developers Guide соответствующий пример. Однако этот код у меня не работает, насколько понимаю, потому, что он дан для VBA.

     

    With ActiveCell
     Set rng = Range(.Offset(1), .Offset(1).End(xlDown))
     .Formula = "=SUM(" & _
       rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) & ")"
     .Copy Destination:=Range(.Cells(1), .Offset(1).End(xlToRight).Offset(-1))
    End With
    

     


    Вопрос: как следует написать подобное для vbscript? Он у меня затыкается на определении области rng, пишет "Неизвестная ошибка выполнения".

     

    objExcel.Range("B2").Activate
    
    With objExcel.ActiveCell
    
    	Set rng = Range(.Offset(1), .Offset(1).End(xlToRight))
    	.Formula = ...(погрызено)
    End With
    


     



    29 июня 2011 г. 12:51

Ответы

  • Понял. Теперь скрипт выглядит близко к варианту на VBA:

     

    	const xlDown =		-4121 'from enum XlDirection
    	const xlToLeft =	-4159 'from enum XlDirection
    	const xlToRight =	-4161 'from enum XlDirection
    	const xlUp =		-4162 'from enum XlDirection
    	const xlA1 =		&H1	' from enum XlReferenceStyle
    	const xlR1C1 =		-4150 ' from enum XlReferenceStyle
    
    	Set objExcel = CreateObject("Excel.Application")
    	objExcel.Visible = True
    
    	With objExcel
    		.Range("B:B").Insert
    		.Range("B1").Select
    		.Selection.Value = "Сумма"
    		.Selection.Orientation = 90
    		.Range("B2").Activate
    		Set myRng = .Range(.ActiveCell.Offset(0, 1),.ActiveCell.Offset(0, 1).End(xlToRight))
    		.ActiveCell.Formula = "=SUM(" & myRng.Address(False, False) & ")"
    		.Range("A2", .Range("A2").Offset.End(xlDown)).Select
    		.Range("B2").Copy .Selection.Offset(0, 1)
    		.Cells.EntireColumn.AutoFit
    	End With
    
    


     




    • Помечено в качестве ответа me4huk 30 июня 2011 г. 7:23
    30 июня 2011 г. 7:22

Все ответы

  • 'arrValues = Array(1,5,7,9,11,13,15,17)
    
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    objExcel.Workbooks.Add
    
    
    StartRow=2
    EndRow=10
    
    column = 5
    
    For n=StartRow to EndRow
    
    'wscript.echo "=SUM(" & ColumnLetter(1) & n & ":" & ColumnLetter(column-1) & n & ")"
    objExcel.Cells(n,column).Formula = "=SUM(" & ColumnLetter(2) & n & ":" & ColumnLetter(column-1) & n & ")"
    
    Next
    
    'функция взята с http://www.freevbcode.com/ShowCode.asp?ID=4303
    Function ColumnLetter(ColumnNumber) 
     If ColumnNumber > 26 Then
    
      ColumnLetter = Chr(Int((ColumnNumber - 1) / 26) + 64) & Chr(((ColumnNumber - 1) Mod 26) + 65)
     Else
      ' Columns A-Z
      ColumnLetter = Chr(ColumnNumber + 64)
     End If
    End Function
    

    Ну вот чот типа этого...

    функцию не тестил..

    29 июня 2011 г. 14:16
  • Ага. Значит нужно идти, что называется, "в обход". Конструкцию, хотя бы приблизительно похожую на VBA, в vbscript построить не удастся?


    30 июня 2011 г. 5:11
  • Однако, нифига. Похоже, можно и перенести конструкцию из VBA. Во всяком случае, посчитать сумму для одной ячейки у меня уже получилось.

    Всё дело в том, что переменные типа xl... объявлены (как это ни странно:) ) в Excel, vbscript же о них не имеет никакого представления. Их нужно просто объявить в виде констант.

    Сейчас участок скрипта у меня выглядит так:

     

    	const xlDown =		-4121 'from enum XlDirection
    	const xlToLeft =	-4159 'from enum XlDirection
    	const xlToRight =	-4161 'from enum XlDirection
    	const xlUp =		-4162 'from enum XlDirection
    	Set objExcel = CreateObject("Excel.Application")
    	objExcel.Visible = True
    
    	With objExcel
    		.Range("B:B").Insert
    		.Range("B1").Select
    		.Selection.Value = "Сумма"
    		.Selection.Orientation = 90
    		.Range("B2").Activate
    		Set myRng = .Range(.ActiveCell.Offset(0, 1),.ActiveCell.Offset(0, 1).End(xlToRight))
    		.ActiveCell.Formula = "=SUM(" & myRng.Address & ")"
    	End With
    
    
    Осталось понять, как раскопировать формулу по остальным ячейкам...

     



    30 июня 2011 г. 6:56
  • Понял. Теперь скрипт выглядит близко к варианту на VBA:

     

    	const xlDown =		-4121 'from enum XlDirection
    	const xlToLeft =	-4159 'from enum XlDirection
    	const xlToRight =	-4161 'from enum XlDirection
    	const xlUp =		-4162 'from enum XlDirection
    	const xlA1 =		&H1	' from enum XlReferenceStyle
    	const xlR1C1 =		-4150 ' from enum XlReferenceStyle
    
    	Set objExcel = CreateObject("Excel.Application")
    	objExcel.Visible = True
    
    	With objExcel
    		.Range("B:B").Insert
    		.Range("B1").Select
    		.Selection.Value = "Сумма"
    		.Selection.Orientation = 90
    		.Range("B2").Activate
    		Set myRng = .Range(.ActiveCell.Offset(0, 1),.ActiveCell.Offset(0, 1).End(xlToRight))
    		.ActiveCell.Formula = "=SUM(" & myRng.Address(False, False) & ")"
    		.Range("A2", .Range("A2").Offset.End(xlDown)).Select
    		.Range("B2").Copy .Selection.Offset(0, 1)
    		.Cells.EntireColumn.AutoFit
    	End With
    
    


     




    • Помечено в качестве ответа me4huk 30 июня 2011 г. 7:23
    30 июня 2011 г. 7:22