robust_excel_ole 1.3 → 1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +6 -0
- data/README.rdoc +1 -1
- data/docs/README_open.rdoc +1 -1
- data/docs/README_ranges.rdoc +60 -57
- data/docs/README_sheet.rdoc +1 -1
- data/examples/introducing_examples/example_introducing.rb +42 -0
- data/examples/introducing_examples/example_open.rb +49 -0
- data/examples/introducing_examples/example_range.rb +67 -0
- data/examples/{edit_sheets → modifying_sheets}/example_access_sheets_and_cells.rb +0 -0
- data/examples/{edit_sheets → modifying_sheets}/example_adding_sheets.rb +0 -0
- data/examples/{edit_sheets → modifying_sheets}/example_concating.rb +1 -1
- data/examples/{edit_sheets → modifying_sheets}/example_copying.rb +1 -1
- data/examples/{edit_sheets → modifying_sheets}/example_expanding.rb +1 -1
- data/examples/{edit_sheets → modifying_sheets}/example_naming.rb +1 -1
- data/examples/{edit_sheets → modifying_sheets}/example_ranges.rb +1 -1
- data/examples/{edit_sheets → modifying_sheets}/example_saving.rb +1 -1
- data/examples/open_save_close/example_control_to_excel.rb +2 -2
- data/examples/open_save_close/example_if_obstructed_save.rb +2 -2
- 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_rename_cells.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.rb +2 -2
- data/lib/robust_excel_ole/bookstore.rb +1 -1
- data/lib/robust_excel_ole/cell.rb +15 -2
- data/lib/robust_excel_ole/excel.rb +14 -12
- data/lib/robust_excel_ole/general.rb +12 -0
- data/lib/robust_excel_ole/range.rb +37 -20
- data/lib/robust_excel_ole/reo_common.rb +63 -37
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/{book.rb → workbook.rb} +35 -33
- data/lib/robust_excel_ole/{sheet.rb → worksheet.rb} +22 -22
- data/spec/bookstore_spec.rb +38 -38
- data/spec/cell_spec.rb +10 -10
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +113 -105
- data/spec/general_spec.rb +37 -5
- data/spec/range_spec.rb +34 -19
- data/spec/reo_common_spec.rb +58 -48
- data/spec/{book_spec.rb → workbook_spec.rb} +198 -198
- data/spec/workbook_specs/workbook_all_spec.rb +33 -0
- data/spec/{book_specs/book_close_spec.rb → workbook_specs/workbook_close_spec.rb} +10 -10
- data/spec/{book_specs/book_misc_spec.rb → workbook_specs/workbook_misc_spec.rb} +148 -128
- data/spec/{book_specs/book_open_spec.rb → workbook_specs/workbook_open_spec.rb} +427 -427
- data/spec/{book_specs/book_save_spec.rb → workbook_specs/workbook_save_spec.rb} +44 -44
- data/spec/{book_specs/book_sheet_spec.rb → workbook_specs/workbook_sheet_spec.rb} +19 -19
- data/spec/{book_specs/book_subclass_spec.rb → workbook_specs/workbook_subclass_spec.rb} +5 -6
- data/spec/{book_specs/book_unobtr_spec.rb → workbook_specs/workbook_unobtr_spec.rb} +339 -344
- data/spec/{sheet_spec.rb → worksheet_spec.rb} +85 -55
- metadata +25 -22
- data/spec/book_specs/book_all_spec.rb +0 -22
File without changes
|
File without changes
|
@@ -33,7 +33,7 @@ begin
|
|
33
33
|
cell_name = short_name ? short_name : sheet_name
|
34
34
|
contains_named_cells = true
|
35
35
|
new_sheet[cell.Row, cell.Column].Value = cell.Value
|
36
|
-
new_sheet.add_name(cell_name, cell.Row,cell.Column)
|
36
|
+
new_sheet.add_name(cell_name, [cell.Row,cell.Column])
|
37
37
|
end
|
38
38
|
end
|
39
39
|
new_sheet.Delete() unless contains_named_cells
|
@@ -29,7 +29,7 @@ begin
|
|
29
29
|
book.each do |sheet|
|
30
30
|
sheet.each do |cell_orig|
|
31
31
|
contents = cell_orig.Value
|
32
|
-
sheet.add_name(contents, cell_orig.Row, cell_orig.Column) if contents && contents.is_a?(String)
|
32
|
+
sheet.add_name(contents, [cell_orig.Row, cell_orig.Column]) if contents && contents.is_a?(String)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
simple_file = dir + 'workbook.xls'
|
14
14
|
simple_save_file = dir + 'workbook_save.xls'
|
15
15
|
File.delete simple_save_file rescue nil
|
16
|
-
book =
|
16
|
+
book = Workbook.open(simple_file) # open a book
|
17
17
|
sheet = book.sheet('Sheet1') # access a sheet via the name
|
18
18
|
row_r = sheet.row_range(1) # access the whole range of the first row
|
19
19
|
col_r = sheet.col_range(1, 1..2) # access the first two cells of the range of the first column
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
suffix = ws.last
|
17
17
|
file_name = dir + "/" + workbook_name
|
18
18
|
|
19
|
-
|
19
|
+
Workbook.unobtrusively(file_name) do |book_orig|
|
20
20
|
book_orig.each do |sheet_orig|
|
21
21
|
file_sheet_name = dir + "/" + base_name + "_" + sheet_orig.name + "." + suffix
|
22
22
|
Excel.current.generate_workbook(file_sheet_name)
|
@@ -11,14 +11,14 @@ Excel.kill_all
|
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
|
-
book =
|
14
|
+
book = Workbook.open(file_name) # open a book
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book.sheet(1) # access a sheet
|
18
18
|
sheet[1,1] = sheet[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
19
19
|
sleep 1
|
20
20
|
begin
|
21
|
-
new_book =
|
21
|
+
new_book = Workbook.open(file_name, :if_unsaved => :alert) # open another book with the same file name
|
22
22
|
rescue WorkbookREOError => msg # if the user chooses not open the book,
|
23
23
|
puts "#{msg.message}" # an exeptions is raised
|
24
24
|
end
|
@@ -15,7 +15,7 @@ begin
|
|
15
15
|
book = Workbook.open(file_name, :visible => true) # open a book, make Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book.sheet(1)
|
18
|
-
first_cell = sheet[1,1].
|
18
|
+
first_cell = sheet[1,1].Value # access a sheet
|
19
19
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
new_book = Workbook.open(other_file_name, :if_obstructed => :save) # open a book with the same file name in a different path
|
@@ -23,7 +23,7 @@ begin
|
|
23
23
|
old_book = Workbook.open(file_name, :if_obstructed => :forget ,:visible => true) # open the old book
|
24
24
|
sleep 1
|
25
25
|
old_sheet = old_book.sheet(1)
|
26
|
-
old_first_cell = old_sheet[1,1].
|
26
|
+
old_first_cell = old_sheet[1,1].Value
|
27
27
|
puts "the old book was saved" unless old_first_cell == first_cell
|
28
28
|
new_book.close # close the books
|
29
29
|
old_book.close
|
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
book = Workbook.open(file_name) # open a book
|
15
15
|
sheet = book.sheet(1) # access a sheet
|
16
|
-
sheet[1,1] = sheet[1,1].
|
16
|
+
sheet[1,1] = sheet[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
17
17
|
begin
|
18
18
|
new_book = Workbook.open(file_name) # open another book with the same file name
|
19
19
|
rescue WorkbookNotSaved => msg # by default: raises an exception:
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
#book.excel.visible = true # make current Excel visible
|
17
17
|
sleep 1
|
18
18
|
sheet = book.sheet(1) # access a sheet
|
19
|
-
first_cell = sheet[1,1].
|
19
|
+
first_cell = sheet[1,1].Value
|
20
20
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
21
21
|
sleep 1
|
22
22
|
puts "new_book: before"
|
@@ -25,11 +25,11 @@ begin
|
|
25
25
|
# and close the unsaved book without saving it
|
26
26
|
puts "new_book: after"
|
27
27
|
sheet_new_book = new_book.sheet(1)
|
28
|
-
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].
|
28
|
+
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].Value == first_cell then # check whether the unsaved book
|
29
29
|
puts "open with :if_unsaved => :forget : the unsaved book is closed and not saved." # is closed and was not saved
|
30
30
|
end
|
31
31
|
sleep 1
|
32
|
-
sheet_new_book[1,1] = sheet_new_book[1,1].
|
32
|
+
sheet_new_book[1,1] = sheet_new_book[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
33
33
|
# open another book in a new Excel application, and make Excel visible, leaving the unsaved book open
|
34
34
|
another_book = Workbook.open(file_name, :if_unsaved => :new_excel, :visible => true)
|
35
35
|
sleep 3 # leaving the unsaved book open
|
@@ -14,21 +14,21 @@ begin
|
|
14
14
|
book = Workbook.open(file_name) # open a book
|
15
15
|
#book.excel.visible = true # make current Excel visible
|
16
16
|
sheet = book.sheet(1) # access a sheet
|
17
|
-
first_cell = sheet[1,1].
|
17
|
+
first_cell = sheet[1,1].Value
|
18
18
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
19
19
|
sleep 1
|
20
20
|
new_book = Workbook.open(file_name, :if_unsaved => :new_excel, :visible => true) # open another book with the same file name in a new Excel
|
21
21
|
sheet_new_book = new_book.sheet(1)
|
22
|
-
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].
|
22
|
+
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].Value == first_cell then # check whether the unsaved book
|
23
23
|
puts "open with :if_unsaved => :forget : the unsaved book is closed and not saved." # is closed and was not saved
|
24
24
|
end
|
25
25
|
sleep 1
|
26
|
-
sheet_new_book[1,1] = sheet_new_book[1,1].
|
26
|
+
sheet_new_book[1,1] = sheet_new_book[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
27
27
|
# open another book in the running Excel application, and make Excel visible, closing the unsaved book
|
28
28
|
another_book = Workbook.open(file_name, :if_unsaved => :forget, :visible => true)
|
29
29
|
sleep 1
|
30
30
|
sheet_another_book = another_book.sheet(1)
|
31
|
-
sheet_another_book[1,1] = sheet_another_book[1,1].
|
31
|
+
sheet_another_book[1,1] = sheet_another_book[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
32
32
|
another_book.close(:if_unsaved => :forget ) # close the last book without saving it.
|
33
33
|
book.close(:if_unsaved => :save) # close the first book and save it before
|
34
34
|
ensure
|
@@ -14,7 +14,7 @@ begin
|
|
14
14
|
book = Workbook.open(file_name, :read_only => true, :visible => true) # open a book with read_only and make Excel visible
|
15
15
|
sheet = book.sheet(1) # access a sheet
|
16
16
|
sleep 1
|
17
|
-
sheet[1,1] = sheet[1,1].
|
17
|
+
sheet[1,1] = sheet[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
18
18
|
sleep 1
|
19
19
|
begin
|
20
20
|
book.save # simple save.
|
@@ -17,7 +17,7 @@ begin
|
|
17
17
|
workbook = book.ole_workbook
|
18
18
|
fullname = workbook.Fullname
|
19
19
|
puts "fullname: #{fullname}"
|
20
|
-
sheet.add_name("a_name",1,1) # rename cell A1 to "a_name"
|
20
|
+
sheet.add_name("a_name",[1,1]) # rename cell A1 to "a_name"
|
21
21
|
number = workbook.Names.Count
|
22
22
|
puts "number of name objects :#{number}"
|
23
23
|
name_object = workbook.Names("a_name")
|
@@ -20,7 +20,7 @@ begin
|
|
20
20
|
book.excel.visible = true # make current Excel visible
|
21
21
|
sheet = book.sheet(1) # access a sheet
|
22
22
|
sleep 1
|
23
|
-
sheet[1,1] = sheet[1,1].
|
23
|
+
sheet[1,1] = sheet[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
24
24
|
sleep 1
|
25
25
|
book.save # simple save
|
26
26
|
begin
|
@@ -12,14 +12,14 @@ begin
|
|
12
12
|
simple_file = dir + 'workbook.xls'
|
13
13
|
book = Workbook.open(simple_file, :visible => true) # open a book, make Excel visible
|
14
14
|
old_sheet = book.sheet(1)
|
15
|
-
p "1st cell: #{old_sheet[1,1].
|
15
|
+
p "1st cell: #{old_sheet[1,1].Value}"
|
16
16
|
sleep 2
|
17
17
|
Workbook.unobtrusively(simple_file) do |book| # modify the book and keep its status unchanged
|
18
18
|
sheet = book.sheet(1)
|
19
|
-
sheet[1,1] = sheet[1,1].
|
19
|
+
sheet[1,1] = sheet[1,1].Value == "simple" ? "complex" : "simple"
|
20
20
|
end
|
21
21
|
new_sheet = book.sheet(1)
|
22
|
-
p "1st cell: #{new_sheet[1,1].
|
22
|
+
p "1st cell: #{new_sheet[1,1].Value}"
|
23
23
|
p "book saved" if book.Saved
|
24
24
|
book.close # close the book
|
25
25
|
ensure
|
data/lib/robust_excel_ole.rb
CHANGED
@@ -3,8 +3,8 @@ require File.join(File.dirname(__FILE__), 'robust_excel_ole/reo_common')
|
|
3
3
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/general')
|
4
4
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/excel')
|
5
5
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/bookstore')
|
6
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/
|
7
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/
|
6
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/workbook')
|
7
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/worksheet')
|
8
8
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cell')
|
9
9
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range')
|
10
10
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cygwin') if RUBY_PLATFORM =~ /cygwin/
|
@@ -12,8 +12,21 @@ module RobustExcelOle
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def method_missing(
|
16
|
-
|
15
|
+
def method_missing(name, *args) # :nodoc: #
|
16
|
+
if name.to_s[0,1] =~ /[A-Z]/
|
17
|
+
begin
|
18
|
+
@cell.send(name, *args)
|
19
|
+
rescue WIN32OLERuntimeError => msg
|
20
|
+
if msg.message =~ /unknown property or method/
|
21
|
+
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
22
|
+
else
|
23
|
+
raise msg
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
super
|
28
|
+
end
|
17
29
|
end
|
30
|
+
|
18
31
|
end
|
19
32
|
end
|
@@ -10,6 +10,8 @@ end
|
|
10
10
|
|
11
11
|
module RobustExcelOle
|
12
12
|
|
13
|
+
# see https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#methods
|
14
|
+
|
13
15
|
class Excel < RangeOwners
|
14
16
|
|
15
17
|
attr_accessor :ole_excel
|
@@ -124,7 +126,7 @@ module RobustExcelOle
|
|
124
126
|
self.displayalerts = opts[:displayalerts]
|
125
127
|
self.calculation = opts[:calculation]
|
126
128
|
if opts[:reopen_workbooks]
|
127
|
-
books =
|
129
|
+
books = workbook_class.books
|
128
130
|
books.each do |book|
|
129
131
|
book.reopen if ((not book.alive?) && book.excel.alive? && book.excel == self)
|
130
132
|
end
|
@@ -224,7 +226,7 @@ module RobustExcelOle
|
|
224
226
|
end
|
225
227
|
|
226
228
|
# closes all Excel instances
|
227
|
-
# @return [
|
229
|
+
# @return [Integer,Integer] number of closed Excel instances, number of errors
|
228
230
|
# remark: the returned number of closed Excel instances is valid only for known Excel instances
|
229
231
|
# if there are unknown Excel instances (opened not via this class), then they are counted as 1
|
230
232
|
# @param [Hash] options the options
|
@@ -359,7 +361,7 @@ module RobustExcelOle
|
|
359
361
|
end
|
360
362
|
|
361
363
|
# kill all Excel instances
|
362
|
-
# @return [
|
364
|
+
# @return [Integer] number of killed Excel processes
|
363
365
|
def self.kill_all
|
364
366
|
number = 0
|
365
367
|
WIN32OLE.connect("winmgmts:\\\\.").InstancesOf("win32_process").each do |p|
|
@@ -528,7 +530,7 @@ module RobustExcelOle
|
|
528
530
|
def calculation= calculation_mode
|
529
531
|
return if calculation_mode.nil?
|
530
532
|
@calculation = calculation_mode
|
531
|
-
calc_mode_changable = @ole_excel.Workbooks.Count > 0 && @ole_excel.Calculation.is_a?(
|
533
|
+
calc_mode_changable = @ole_excel.Workbooks.Count > 0 && @ole_excel.Calculation.is_a?(Integer)
|
532
534
|
if calc_mode_changable
|
533
535
|
if calculation_mode == :manual then
|
534
536
|
saved = []
|
@@ -562,7 +564,7 @@ module RobustExcelOle
|
|
562
564
|
self.calculation = calculation_mode
|
563
565
|
yield self
|
564
566
|
ensure
|
565
|
-
@ole_excel.Calculation = old_calculation_mode if @ole_excel.Calculation.is_a?(
|
567
|
+
@ole_excel.Calculation = old_calculation_mode if @ole_excel.Calculation.is_a?(Integer)
|
566
568
|
end
|
567
569
|
end
|
568
570
|
|
@@ -587,7 +589,7 @@ module RobustExcelOle
|
|
587
589
|
end
|
588
590
|
end
|
589
591
|
ole_workbooks.each do |ole_workbook|
|
590
|
-
|
592
|
+
workbook_class.open(ole_workbook).for_this_workbook(options)
|
591
593
|
end
|
592
594
|
end
|
593
595
|
|
@@ -622,17 +624,17 @@ module RobustExcelOle
|
|
622
624
|
self.to_s
|
623
625
|
end
|
624
626
|
|
625
|
-
def self.
|
626
|
-
@
|
627
|
+
def self.workbook_class # :nodoc: #
|
628
|
+
@workbook_class ||= begin
|
627
629
|
module_name = self.parent_name
|
628
|
-
"#{module_name}::
|
630
|
+
"#{module_name}::Workbook".constantize
|
629
631
|
rescue NameError => e
|
630
|
-
|
632
|
+
Workbook
|
631
633
|
end
|
632
634
|
end
|
633
635
|
|
634
|
-
def
|
635
|
-
self.class.
|
636
|
+
def workbook_class # :nodoc: #
|
637
|
+
self.class.workbook_class
|
636
638
|
end
|
637
639
|
|
638
640
|
include MethodHelpers
|
@@ -29,6 +29,18 @@ module General
|
|
29
29
|
end
|
30
30
|
|
31
31
|
class WIN32OLE
|
32
|
+
|
33
|
+
# promoting WIN32OLE objects to RobustExcelOle objects
|
34
|
+
def to_reo
|
35
|
+
case self.ole_type.name
|
36
|
+
when "Range" then RobustExcelOle::Range.new(self)
|
37
|
+
when "_Worksheet" then Worksheet.new(self)
|
38
|
+
when "_Workbook" then Workbook.new(self)
|
39
|
+
when "_Application" then Excel.new(self)
|
40
|
+
else
|
41
|
+
self
|
42
|
+
end
|
43
|
+
end
|
32
44
|
end
|
33
45
|
|
34
46
|
class ::String # :nodoc: #
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
module RobustExcelOle
|
3
3
|
|
4
|
+
# see https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet#methods
|
5
|
+
|
4
6
|
class Range < REOCommon
|
5
7
|
include Enumerable
|
6
8
|
attr_reader :ole_range
|
@@ -8,7 +10,7 @@ module RobustExcelOle
|
|
8
10
|
|
9
11
|
def initialize(win32_range)
|
10
12
|
@ole_range = win32_range
|
11
|
-
@worksheet =
|
13
|
+
@worksheet = worksheet_class.new(self.Parent)
|
12
14
|
end
|
13
15
|
|
14
16
|
def each
|
@@ -21,7 +23,7 @@ module RobustExcelOle
|
|
21
23
|
# @params [Range] a range
|
22
24
|
# @returns [Array] the values
|
23
25
|
def values(range = nil)
|
24
|
-
result = self.map{|x| x.
|
26
|
+
result = self.map{|x| x.Value}.flatten
|
25
27
|
if range
|
26
28
|
relevant_result = []
|
27
29
|
result.each_with_index{ |row_or_column, i| relevant_result << row_or_column if range.include?(i) }
|
@@ -37,44 +39,59 @@ module RobustExcelOle
|
|
37
39
|
end
|
38
40
|
|
39
41
|
# copies a range
|
40
|
-
# @params [
|
41
|
-
# @
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
# @params [Address] address of a range
|
43
|
+
# @options [Worksheet] the worksheet in which to copy
|
44
|
+
def copy(address, sheet = :__not_provided, third_argument_deprecated = :__not_provided)
|
45
|
+
if third_argument_deprecated != :__not_provided
|
46
|
+
address = [address,sheet]
|
47
|
+
sheet = third_argument_deprecated
|
48
|
+
end
|
49
|
+
address = Address.new(address)
|
46
50
|
sheet = @worksheet if sheet == :__not_provided
|
51
|
+
destination_range = sheet.range([address.rows.min..address.rows.max,
|
52
|
+
address.columns.min..address.columns.max]).ole_range
|
47
53
|
if sheet.workbook.excel == @worksheet.workbook.excel
|
48
54
|
begin
|
49
|
-
self.Copy(:destination =>
|
50
|
-
int_range2.min..int_range2.max).ole_range)
|
55
|
+
self.Copy(:destination => destination_range)
|
51
56
|
rescue WIN32OLERuntimeError
|
52
57
|
raise RangeNotCopied, "cannot copy range"
|
53
58
|
end
|
54
59
|
else
|
55
60
|
self.Select
|
56
61
|
self.Copy
|
57
|
-
sheet.Paste(
|
62
|
+
sheet.Paste(destination_range)
|
58
63
|
end
|
59
64
|
end
|
60
65
|
|
61
|
-
def self.
|
62
|
-
@
|
66
|
+
def self.worksheet_class # :nodoc: #
|
67
|
+
@worksheet_class ||= begin
|
63
68
|
module_name = self.parent_name
|
64
|
-
"#{module_name}::
|
69
|
+
"#{module_name}::Worksheet".constantize
|
65
70
|
rescue NameError => e
|
66
|
-
|
71
|
+
Worksheet
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
70
|
-
def
|
71
|
-
self.class.
|
75
|
+
def worksheet_class # :nodoc: #
|
76
|
+
self.class.worksheet_class
|
72
77
|
end
|
73
78
|
|
74
79
|
private
|
75
|
-
|
76
|
-
|
77
|
-
|
80
|
+
def method_missing(name, *args) # :nodoc: #
|
81
|
+
if name.to_s[0,1] =~ /[A-Z]/
|
82
|
+
begin
|
83
|
+
@ole_range.send(name, *args)
|
84
|
+
rescue WIN32OLERuntimeError => msg
|
85
|
+
if msg.message =~ /unknown property or method/
|
86
|
+
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
87
|
+
else
|
88
|
+
raise msg
|
89
|
+
end
|
90
|
+
end
|
91
|
+
else
|
92
|
+
super
|
93
|
+
end
|
78
94
|
end
|
95
|
+
|
79
96
|
end
|
80
97
|
end
|