エクセルシートのセルの参照方法

お願いします。
nvokecode内で下記の様なコーディングを行いましたが

Dim xlSheet As Worksheet
Dim PG As Integer
Dim PR As Integer
xlSheet = DirectCast(xlWorkbook.Sheets("リスト”), Worksheet)
while xlSheet.cells(PG,PR) <> “”

whileの行でエラーとなってしまします。
直接セルを参照することはできないのでしょうか
宜しくお願いします。

InvokeCodeは使ったことないですが、
添付されたソースがそのままのコードでしたら、
PG,PRは0となり、Cells(0,0)を評価しようとしてエラーになっている?

xlSheet.cells(PG,PR) の結果は「Range型」なので、””(Empty)で比較できません。
以下のように「明示的にRange型にキャスト」して、Range型のプロパティで空か?を判定する必要があります。

※ DirectCastもCTypeもキャストです。

'// Argument
Dim bookPath As String = "test.xlsx"
Dim sheetName As String = "Sheet1"

'// Variables
Dim ap As New Microsoft.Office.Interop.Excel.Application
Dim wb As Microsoft.Office.Interop.Excel.Workbook
Dim ws As Microsoft.Office.Interop.Excel.Worksheet
Dim rg As Microsoft.Office.Interop.Excel.Range

Try 
	wb = ap.Workbooks.Open(IO.path.GetFullPath(bookPath))
	ws = CType(wb.Sheets(sheetName), Microsoft.Office.Interop.Excel.Worksheet)
	Dim rowidx As Integer = 1 '// 1=1行目
	Dim colidx As Integer = 2 '// 2=B列
	Do While Not(CType(ws.Cells(rowidx, colidx), Microsoft.Office.Interop.Excel.Range).value Is Nothing)
		Console.WriteLine(String.Format("Cells({0},{1}={2}", rowidx, colidx, CType(ws.Cells(rowidx,colidx), Microsoft.Office.Interop.Excel.Range).Value2.ToString))
		rowidx +=1
	Loop
	wb.Close
	wb = Nothing
	ap = Nothing
Catch ex As Exception
    If Not(wb Is Nothing) Then wb = Nothing
    If Not(ap Is Nothing) Then ap = Nothing
    Console.writeLine(ex.ToString)
    Throw(ex)
End Try

ありがとうございます。実際には PG PR には数値は代入しております。記述不足でもうしわけございませんでした。DirectCast(xlSheet.cells(PG,PR),range).text.tostring() 投降後色々調べた結果左記のコーディングで動作可能となっていますが、 不便ですね。

ありがとうございます。Range型になるんですね。DIirectCast は VB のSET命令と同様と思っていたのが間違いなんですね。

お!なら、.Textとか、.Valueを付けたら、簡単?

私も最初はそう思って。下記コーディングで上手くいったのですが
Dim range As Range
range = xlSheet.range(“A2:A2”)
msgbox(range.value)

いざ参照となるとエラーになるんです。
不思議ですよね

1 Like

Rangeだけではなく、もっと上位の参照にしないとダメ?
Application.Excel.Range(←適当です)とか