robust_excel_ole 1.31 → 1.32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +20 -1
- data/README.rdoc +118 -18
- data/___dummy_workbook.xls +0 -0
- data/benchmarking/creek_example.rb +1 -1
- data/benchmarking/roo_example.rb +1 -1
- data/benchmarking/simple_xlsx_reader_example.rb +1 -1
- data/benchmarking/spreadsheet_example.rb +1 -1
- data/docs/README_excel.rdoc +16 -24
- data/docs/README_listobjects.rdoc +176 -0
- data/docs/README_open.rdoc +12 -12
- data/docs/README_ranges.rdoc +72 -55
- data/docs/README_save_close.rdoc +3 -3
- data/docs/README_sheet.rdoc +18 -13
- data/examples/example_ruby_library.rb +2 -2
- data/examples/introductory_examples/example_range.rb +2 -2
- data/examples/modifying_sheets/example_access_sheets_and_cells.rb +6 -6
- data/examples/modifying_sheets/example_add_names.rb +1 -1
- data/examples/modifying_sheets/example_concating.rb +1 -1
- data/examples/modifying_sheets/example_copying.rb +2 -2
- data/examples/modifying_sheets/example_listobjects.rb +86 -0
- data/examples/modifying_sheets/example_naming.rb +1 -1
- data/examples/modifying_sheets/example_ranges.rb +1 -1
- data/examples/open_save_close/example_control_to_excel.rb +1 -1
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +1 -1
- data/examples/open_save_close/example_if_obstructed_save.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_accept.rb +1 -1
- data/examples/open_save_close/example_if_unsaved_forget.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_forget_more.rb +4 -4
- data/examples/open_save_close/example_read_only.rb +1 -1
- data/examples/open_save_close/example_simple.rb +1 -1
- data/examples/open_save_close/example_unobtrusively.rb +3 -3
- data/lib/robust_excel_ole/address_tool.rb +54 -44
- data/lib/robust_excel_ole/base.rb +4 -6
- data/lib/robust_excel_ole/bookstore.rb +2 -16
- data/lib/robust_excel_ole/cell.rb +16 -21
- data/lib/robust_excel_ole/excel.rb +131 -186
- data/lib/robust_excel_ole/general.rb +82 -55
- data/lib/robust_excel_ole/list_object.rb +182 -109
- data/lib/robust_excel_ole/list_row.rb +65 -38
- data/lib/robust_excel_ole/range.rb +125 -93
- data/lib/robust_excel_ole/range_owners.rb +52 -66
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +168 -176
- data/lib/robust_excel_ole/worksheet.rb +177 -141
- data/robust_excel_ole.gemspec +4 -3
- data/spec/bookstore_spec.rb +2 -3
- data/spec/cell_spec.rb +9 -9
- data/spec/data/more_data/workbook.xls +0 -0
- data/spec/excel_spec.rb +132 -85
- data/spec/general_spec.rb +47 -15
- data/spec/list_object_spec.rb +258 -145
- data/spec/list_row_spec.rb +218 -0
- data/spec/range_spec.rb +76 -29
- data/spec/spec_helper.rb +15 -1
- data/spec/workbook_spec.rb +75 -34
- data/spec/workbook_specs/workbook_all_spec.rb +2 -1
- data/spec/workbook_specs/workbook_misc_spec.rb +20 -13
- data/spec/workbook_specs/workbook_open_spec.rb +47 -45
- data/spec/workbook_specs/workbook_save_spec.rb +21 -22
- data/spec/workbook_specs/workbook_sheet_spec.rb +3 -3
- data/spec/workbook_specs/workbook_unobtr_spec.rb +303 -303
- data/spec/worksheet_spec.rb +522 -318
- metadata +37 -2
@@ -4,23 +4,30 @@ module RobustExcelOle
|
|
4
4
|
|
5
5
|
using StringRefinement
|
6
6
|
|
7
|
-
class ListRow
|
7
|
+
class ListRow < VbaObjects
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
attr_reader :ole_tablerow
|
10
|
+
|
11
|
+
alias ole_object ole_tablerow
|
12
|
+
|
13
|
+
def initialize(rownumber_or_oletablerow)
|
14
|
+
@ole_tablerow = if !rownumber_or_oletablerow.respond_to?(:succ)
|
15
|
+
rownumber_or_oletablerow
|
16
|
+
else
|
17
|
+
ole_table.ListRows.Item(rownumber_or_oletablerow)
|
18
|
+
end
|
11
19
|
end
|
12
20
|
|
13
21
|
# returns the value of the cell with given column name or number
|
14
22
|
# @param [Variant] column number or column name
|
15
23
|
# @return [Variant] value of the cell
|
16
24
|
def [] column_number_or_name
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
25
|
+
ole_cell = ole_table.Application.Intersect(
|
26
|
+
@ole_tablerow.Range, ole_table.ListColumns.Item(column_number_or_name).Range)
|
27
|
+
value = ole_cell.Value
|
28
|
+
value.respond_to?(:gsub) ? value.encode('utf-8') : value
|
29
|
+
rescue WIN32OLERuntimeError
|
30
|
+
raise TableRowError, "could not determine the value at column #{column_number_or_name}\n#{$!.message}"
|
24
31
|
end
|
25
32
|
|
26
33
|
# sets the value of the cell with given column name or number
|
@@ -29,49 +36,66 @@ module RobustExcelOle
|
|
29
36
|
def []=(column_number_or_name, value)
|
30
37
|
begin
|
31
38
|
ole_cell = ole_table.Application.Intersect(
|
32
|
-
@
|
39
|
+
@ole_tablerow.Range, ole_table.ListColumns.Item(column_number_or_name).Range)
|
33
40
|
ole_cell.Value = value
|
34
41
|
rescue WIN32OLERuntimeError
|
35
|
-
raise TableRowError, "could not assign value #{value.inspect} to cell at column #{column_number_or_name}"
|
42
|
+
raise TableRowError, "could not assign value #{value.inspect} to cell at column #{column_number_or_name}\n#{$!.message}"
|
36
43
|
end
|
37
44
|
end
|
38
45
|
|
39
46
|
# values of the row
|
40
47
|
# @return [Array] values of the row
|
41
48
|
def values
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
49
|
+
value = @ole_tablerow.Range.Value
|
50
|
+
return value if value==[nil]
|
51
|
+
value = if !value.respond_to?(:pop)
|
52
|
+
[value]
|
53
|
+
elsif value.first.respond_to?(:pop)
|
54
|
+
value.first
|
46
55
|
end
|
56
|
+
value.map{|v| v.respond_to?(:gsub) ? v.encode('utf-8') : v}
|
57
|
+
rescue WIN32OLERuntimeError
|
58
|
+
raise TableError, "could not read values\n#{$!.message}"
|
47
59
|
end
|
48
60
|
|
49
61
|
# sets the values of the row
|
50
62
|
# @param [Array] values of the row
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
63
|
+
def values= values
|
64
|
+
updated_values = self.values
|
65
|
+
updated_values[0,values.length] = values
|
66
|
+
@ole_tablerow.Range.Value = [updated_values]
|
67
|
+
values
|
68
|
+
rescue WIN32OLERuntimeError
|
69
|
+
raise TableError, "could not set values #{values.inspect}\n#{$!.message}"
|
70
|
+
end
|
71
|
+
|
72
|
+
# key-value pairs of the row
|
73
|
+
# @return [Hash] key-value pairs of the row
|
74
|
+
def keys_values
|
75
|
+
ole_table.column_names.zip(values).to_h
|
60
76
|
end
|
61
77
|
|
78
|
+
alias set_values values=
|
79
|
+
alias to_a values
|
80
|
+
alias to_h keys_values
|
81
|
+
|
62
82
|
# deletes the values of the row
|
63
83
|
def delete_values
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
84
|
+
@ole_tablerow.Range.Value = [[].fill(nil,0..(ole_table.ListColumns.Count)-1)]
|
85
|
+
nil
|
86
|
+
rescue WIN32OLERuntimeError
|
87
|
+
raise TableError, "could not delete values\n#{$!.message}"
|
88
|
+
end
|
89
|
+
|
90
|
+
def == other_listrow
|
91
|
+
other_listrow.is_a?(ListRow) && other_listrow.values == self.values
|
92
|
+
end
|
71
93
|
|
72
94
|
def method_missing(name, *args)
|
95
|
+
# this should not happen:
|
96
|
+
raise(TableRowError, "internal error: ole_table not defined") unless self.class.method_defined?(:ole_table)
|
73
97
|
name_str = name.to_s
|
74
|
-
core_name = name_str
|
98
|
+
core_name = name_str.chomp('=')
|
75
99
|
column_names = ole_table.HeaderRowRange.Value.first
|
76
100
|
column_name = column_names.find do |c|
|
77
101
|
c == core_name ||
|
@@ -82,9 +106,7 @@ module RobustExcelOle
|
|
82
106
|
c.replace_umlauts.underscore.gsub(/\W/,'_') == core_name
|
83
107
|
end
|
84
108
|
if column_name
|
85
|
-
|
86
|
-
method_name = core_name.replace_umlauts.underscore + appended_eq
|
87
|
-
define_and_call_method(column_name,method_name,*args)
|
109
|
+
define_and_call_method(column_name, name, *args)
|
88
110
|
else
|
89
111
|
super(name, *args)
|
90
112
|
end
|
@@ -97,14 +119,15 @@ module RobustExcelOle
|
|
97
119
|
|
98
120
|
# @private
|
99
121
|
def inspect
|
100
|
-
"#<ListRow:
|
122
|
+
"#<ListRow: index:#{@ole_tablerow.Index} size:#{ole_table.ListColumns.Count} #{ole_table.Name}>"
|
101
123
|
end
|
102
124
|
|
103
125
|
private
|
104
126
|
|
105
127
|
def define_and_call_method(column_name,method_name,*args)
|
128
|
+
column_name = column_name.force_encoding('cp850')
|
106
129
|
ole_cell = ole_table.Application.Intersect(
|
107
|
-
@
|
130
|
+
@ole_tablerow.Range, ole_table.ListColumns.Item(column_name).Range)
|
108
131
|
define_getting_setting_method(ole_cell,method_name)
|
109
132
|
self.send(method_name, *args)
|
110
133
|
end
|
@@ -122,6 +145,10 @@ module RobustExcelOle
|
|
122
145
|
end
|
123
146
|
|
124
147
|
end
|
148
|
+
|
149
|
+
# @private
|
150
|
+
class TableRowError < WorksheetREOError
|
151
|
+
end
|
125
152
|
|
126
153
|
TableRow = ListRow
|
127
154
|
|
@@ -20,7 +20,7 @@ module RobustExcelOle
|
|
20
20
|
|
21
21
|
def initialize(win32_range, worksheet = nil)
|
22
22
|
@ole_range = win32_range
|
23
|
-
@worksheet = worksheet ? worksheet
|
23
|
+
@worksheet = (worksheet ? worksheet : self.Parent).to_reo
|
24
24
|
end
|
25
25
|
|
26
26
|
def rows
|
@@ -32,8 +32,12 @@ module RobustExcelOle
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def each
|
35
|
-
|
36
|
-
|
35
|
+
if block_given?
|
36
|
+
@ole_range.lazy.each_with_index do |ole_cell, index|
|
37
|
+
yield cell(index){ole_cell}
|
38
|
+
end
|
39
|
+
else
|
40
|
+
to_enum(:each).lazy
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
@@ -71,68 +75,90 @@ module RobustExcelOle
|
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
74
|
-
# returns
|
78
|
+
# returns values of a given range
|
75
79
|
# @returns [Array] values of the range (as a nested array)
|
80
|
+
=begin
|
76
81
|
def value
|
77
|
-
begin
|
78
|
-
if !::RANGES_JRUBY_BUG
|
79
|
-
|
80
|
-
|
81
|
-
values = []
|
82
|
-
rows.each do |r|
|
83
|
-
values_col = []
|
84
|
-
columns.each{ |c| values_col << worksheet.Cells(r,c).Value}
|
85
|
-
values << values_col
|
82
|
+
value = begin
|
83
|
+
if !::RANGES_JRUBY_BUG
|
84
|
+
ole_range.Value[0,[ole_range.Rows.Count,worksheet.last_row].min].inject([]) do |res, row|
|
85
|
+
res << (!row.nil? ? row[0,[ole_range.Columns.Count,worksheet.last_column].min] : nil)
|
86
86
|
end
|
87
|
-
|
87
|
+
else
|
88
|
+
# optimization is possible here
|
89
|
+
rows_used_range = [rows, last_row].min
|
90
|
+
columns_used_rage = [columns, last_column].min
|
91
|
+
values = rows_used_range.map{|r| columns_used_range.map {|c| worksheet.Cells(r,c).Value} }
|
92
|
+
(values.size==1 && values.first.size==1) ? values.first.first : values
|
88
93
|
end
|
89
|
-
rescue
|
90
|
-
raise RangeNotEvaluatable,
|
91
|
-
end
|
94
|
+
rescue
|
95
|
+
raise RangeNotEvaluatable, "cannot evaluate range #{self.inspect}\n#{$!.message}"
|
96
|
+
end
|
97
|
+
if value == -2146828288 + RobustExcelOle::XlErrName
|
98
|
+
raise RangeNotEvaluatable, "cannot evaluate range #{self.inspect}"
|
99
|
+
end
|
100
|
+
value
|
101
|
+
end
|
102
|
+
=end
|
92
103
|
|
104
|
+
def value
|
105
|
+
value = begin
|
106
|
+
if !::RANGES_JRUBY_BUG
|
107
|
+
ole_range.Application.Intersect(ole_range, worksheet.Range(
|
108
|
+
worksheet.Cells(1,1),worksheet.Cells(worksheet.last_row,worksheet.last_column))).Value
|
109
|
+
else
|
110
|
+
# optimization is possible here
|
111
|
+
rows_used_range = [rows, last_row].min
|
112
|
+
columns_used_rage = [columns, last_column].min
|
113
|
+
values = rows_used_range.map{|r| columns_used_range.map {|c| worksheet.Cells(r,c).Value} }
|
114
|
+
(values.size==1 && values.first.size==1) ? values.first.first : values
|
115
|
+
end
|
116
|
+
rescue
|
117
|
+
raise RangeNotEvaluatable, "cannot evaluate range #{self.inspect}\n#{$!.message}"
|
118
|
+
end
|
119
|
+
if value == -2146828288 + RobustExcelOle::XlErrName
|
120
|
+
raise RangeNotEvaluatable, "cannot evaluate range #{self.inspect}"
|
121
|
+
end
|
122
|
+
value
|
93
123
|
end
|
94
124
|
|
95
125
|
# sets the values if the range
|
96
126
|
# @param [Variant] value
|
97
127
|
def value=(value)
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
ole_range.Cells(i+1,j+1).Value = (value.respond_to?(:first) ? value[i][j] : value)
|
105
|
-
end
|
128
|
+
if !::RANGES_JRUBY_BUG
|
129
|
+
ole_range.Value = value
|
130
|
+
else
|
131
|
+
rows.each_with_index do |r,i|
|
132
|
+
columns.each_with_index do |c,j|
|
133
|
+
ole_range.Cells(i+1,j+1).Value = (value.respond_to?(:pop) ? value[i][j] : value)
|
106
134
|
end
|
107
135
|
end
|
108
|
-
value
|
109
|
-
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
110
|
-
raise RangeNotEvaluatable, "cannot assign value to range #{self.inspect}"
|
111
136
|
end
|
137
|
+
value
|
138
|
+
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
139
|
+
raise RangeNotEvaluatable, "cannot assign value to range #{self.inspect}\n#{$!.message}"
|
112
140
|
end
|
113
141
|
|
114
|
-
|
115
|
-
|
142
|
+
alias v value
|
143
|
+
alias v= value=
|
116
144
|
|
117
145
|
# sets the values if the range with a given color
|
118
146
|
# @param [Variant] value
|
119
147
|
# @option opts [Symbol] :color the color of the cell when set
|
120
148
|
def set_value(value, opts = { })
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
ole_range.Cells(i+1,j+1).Value = (value.respond_to?(:first) ? value[i][j] : value)
|
128
|
-
end
|
149
|
+
if !::RANGES_JRUBY_BUG
|
150
|
+
ole_range.Value = value
|
151
|
+
else
|
152
|
+
rows.each_with_index do |r,i|
|
153
|
+
columns.each_with_index do |c,j|
|
154
|
+
ole_range.Cells(i+1,j+1).Value = (value.respond_to?(:pop) ? value[i][j] : value)
|
129
155
|
end
|
130
156
|
end
|
131
|
-
ole_range.Interior.ColorIndex = opts[:color] unless opts[:color].nil?
|
132
|
-
value
|
133
|
-
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
134
|
-
raise RangeNotEvaluatable, "cannot assign value to range #{self.inspect}"
|
135
157
|
end
|
158
|
+
ole_range.Interior.ColorIndex = opts[:color] unless opts[:color].nil?
|
159
|
+
value
|
160
|
+
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
161
|
+
raise RangeNotEvaluatable, "cannot assign value to range #{self.inspect}\n#{$!.message}"
|
136
162
|
end
|
137
163
|
|
138
164
|
# copies a range
|
@@ -144,52 +170,61 @@ module RobustExcelOle
|
|
144
170
|
options = { }
|
145
171
|
remaining_args.each do |arg|
|
146
172
|
case arg
|
147
|
-
when
|
173
|
+
when ::Range, Integer then dest_address = [dest_address,arg]
|
148
174
|
when Worksheet, WIN32OLE then dest_sheet = arg.to_reo
|
149
175
|
when Hash then options = arg
|
150
176
|
else raise RangeNotCopied, "cannot copy range: argument error: #{remaining_args.inspect}"
|
151
177
|
end
|
152
178
|
end
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
179
|
+
dest_range_address = destination_range(dest_address, dest_sheet, options)
|
180
|
+
dest_range = dest_sheet.range(dest_range_address)
|
181
|
+
if options[:values_only]
|
182
|
+
dest_range.v = !options[:transpose] ? self.v : self.v.transpose
|
183
|
+
else
|
184
|
+
copy_ranges(dest_address, dest_range, dest_range_address, dest_sheet, options)
|
185
|
+
end
|
186
|
+
dest_range
|
187
|
+
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
188
|
+
raise RangeNotCopied, "cannot copy range\n#{$!.message}"
|
189
|
+
end
|
190
|
+
|
191
|
+
private
|
192
|
+
|
193
|
+
def destination_range(dest_address, dest_sheet, options)
|
194
|
+
rows, columns = address_tool.as_integer_ranges(dest_address)
|
195
|
+
dest_address_is_position = (rows.min == rows.max && columns.min == columns.max)
|
196
|
+
if !dest_address_is_position
|
197
|
+
[rows.min..rows.max,columns.min..columns.max]
|
198
|
+
else
|
199
|
+
ole_rows, ole_columns = self.Rows, self.Columns
|
200
|
+
[rows.min..rows.min + (options[:transpose] ? ole_columns : ole_rows).Count - 1,
|
201
|
+
columns.min..columns.min + (options[:transpose] ? ole_rows : ole_columns).Count - 1]
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def copy_ranges(dest_address, dest_range, dest_range_address, dest_sheet, options)
|
206
|
+
workbook = @worksheet.workbook
|
207
|
+
if dest_range.worksheet.workbook.excel == workbook.excel
|
208
|
+
if options[:transpose]
|
209
|
+
self.Copy
|
210
|
+
dest_range.PasteSpecial(XlPasteAll,XlPasteSpecialOperationNone,false,true)
|
158
211
|
else
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
dest_range.v = options[:transpose] ? self.v.transpose : self.v
|
212
|
+
self.Copy(dest_range.ole_range)
|
213
|
+
end
|
214
|
+
else
|
215
|
+
if options[:transpose]
|
216
|
+
added_sheet = workbook.add_sheet
|
217
|
+
copy(dest_address, added_sheet, transpose: true)
|
218
|
+
added_sheet.range(dest_range_address).copy(dest_address,dest_sheet)
|
219
|
+
workbook.excel.with_displayalerts(false) {added_sheet.Delete}
|
168
220
|
else
|
169
|
-
|
170
|
-
|
171
|
-
self.Copy
|
172
|
-
dest_range.PasteSpecial(XlPasteAll,XlPasteSpecialOperationNone,false,true)
|
173
|
-
else
|
174
|
-
self.Copy(dest_range.ole_range)
|
175
|
-
end
|
176
|
-
else
|
177
|
-
if options[:transpose]
|
178
|
-
added_sheet = @worksheet.workbook.add_sheet
|
179
|
-
self.copy(dest_address, added_sheet, :transpose => true)
|
180
|
-
added_sheet.range(dest_range_address).copy(dest_address,dest_sheet)
|
181
|
-
@worksheet.workbook.excel.with_displayalerts(false) {added_sheet.Delete}
|
182
|
-
else
|
183
|
-
self.Copy
|
184
|
-
dest_sheet.Paste(dest_range.ole_range)
|
185
|
-
end
|
186
|
-
end
|
221
|
+
self.Copy
|
222
|
+
dest_sheet.Paste(dest_range.ole_range)
|
187
223
|
end
|
188
|
-
dest_range
|
189
|
-
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
190
|
-
raise RangeNotCopied, 'cannot copy range'
|
191
224
|
end
|
192
225
|
end
|
226
|
+
|
227
|
+
public
|
193
228
|
|
194
229
|
def == other_range
|
195
230
|
other_range.is_a?(Range) &&
|
@@ -214,7 +249,7 @@ module RobustExcelOle
|
|
214
249
|
|
215
250
|
# @private
|
216
251
|
def to_s
|
217
|
-
"#<REO::Range:
|
252
|
+
"#<REO::Range: #{@ole_range.Address(External: true).gsub(/\$/,'')} >"
|
218
253
|
end
|
219
254
|
|
220
255
|
# @private
|
@@ -245,22 +280,19 @@ module RobustExcelOle
|
|
245
280
|
private
|
246
281
|
|
247
282
|
def method_missing(name, *args)
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
end
|
255
|
-
else
|
256
|
-
begin
|
257
|
-
@ole_range.send(name, *args)
|
258
|
-
rescue NoMethodError
|
259
|
-
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
260
|
-
end
|
283
|
+
super unless name.to_s[0,1] =~ /[A-Z]/
|
284
|
+
if ::ERRORMESSAGE_JRUBY_BUG
|
285
|
+
begin
|
286
|
+
@ole_range.send(name, *args)
|
287
|
+
rescue Java::OrgRacobCom::ComFailException
|
288
|
+
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
261
289
|
end
|
262
290
|
else
|
263
|
-
|
291
|
+
begin
|
292
|
+
@ole_range.send(name, *args)
|
293
|
+
rescue NoMethodError
|
294
|
+
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
295
|
+
end
|
264
296
|
end
|
265
297
|
end
|
266
298
|
end
|