win32ole

(A)だとA列4行目に入っている値が取れてくるのに、(B)だと7行目に入っている値が取れてくるっていう動きがいまいち腑に落ちない。

require 'win32ole'
require 'pp'

def getAbsolutePath filename
  fso = WIN32OLE.new('Scripting.FileSystemObject')
  return fso.GetAbsolutePathName(filename)
end
filename = getAbsolutePath("sample1.xls")

xl = WIN32OLE.new('Excel.Application')

book = xl.Workbooks.Open(filename)
begin
  book.Worksheets.each do |sheet|
    range = sheet.Range(sheet.Cells(4, 1), sheet.Cells(4, 3))
    pp range.Cells(1, 1).value                                  #(A)
    pp range.Range(range.Cells(1, 1), range.Cells(1, 3)).value  #(B)
  end
ensure
  book.Close
  xl.Quit
end