C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

excelの最終行を特定したい

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■92523 / inTopicNo.1)  excelの最終行を特定したい
  
□投稿者/ ど素人 (1回)-(2019/10/02(Wed) 12:08:29)

分類:[C#] 

こんにちは。
c#を仕事で使い始めて1ヶ月のど素人です。
visual studioを使用してます。

string型に格納した、Range情報(B15とかAA15とか…何が来るかはわかりません)を起点に、その列の最終行を求めたいです。
どうしたらいいのか全く分からないので、ご教授願えませんでしょうか?
(1行ずつ値があるかどうかを見て行くしかないのかな?とは思っていますが、そのコードも書けない状態です)

引用返信 編集キー/
■92524 / inTopicNo.2)  Re[1]: excelの最終行を特定したい
□投稿者/ C#素人B (1回)-(2019/10/02(Wed) 13:54:12)
No92523 (ど素人 さん) に返信
> こんにちは。
> c#を仕事で使い始めて1ヶ月のど素人です。
> visual studioを使用してます。
>
> string型に格納した、Range情報(B15とかAA15とか…何が来るかはわかりません)を起点に、その列の最終行を求めたいです。
> どうしたらいいのか全く分からないので、ご教授願えませんでしょうか?
> (1行ずつ値があるかどうかを見て行くしかないのかな?とは思っていますが、そのコードも書けない状態です)
>

自分もC#素人なのでアルゴリズムだけのせます。(もしかしたら便利なライブラリがあるかも...)

◆指定列の最終行を取得するアルゴリズム
1.シート全体の最終行数を取得する。
2.マックスサイズを最終行数にした配列を宣言。
3.指定した列のデータを配列に格納する。
4.配列を最後から見ていき、空じゃないものが出た時breakする。この時の配列の添え字+1が指定列の最終行数になっているはずです。

最近自分もGASで似たようなことをやったので、アルゴリズムはあってると思います。
引用返信 編集キー/
■92526 / inTopicNo.3)  Re[2]: excelの最終行を特定したい
□投稿者/ アンドロイド9 (1回)-(2019/10/02(Wed) 16:42:14)
普通にExcelVBAで考えるなら

オブジェクトSheet1のA列とすると、 

sheet1.cells(excel.rows.count, "A").end(xlup)

で対象列の最終セルが取れると思います。


そのままC#で使えるかは不明です。
引用返信 編集キー/
■92527 / inTopicNo.4)  Re[3]: excelの最終行を特定したい
□投稿者/ 大谷刑部 (31回)-(2019/10/02(Wed) 17:15:09)
No92526 (アンドロイド9 さん) に返信
> そのままC#で使えるかは不明です。

Microsoft.Office.Interop.Excelを参照する限りはcomを使うことになるのでVBだろうがC#だろうが使えるプロパティーとメソッドは同じ。
VBAでできることしか基本できません。

そして、理論上、VBAで処理するより遅いはず。

だからと言ってマクロ付のexcelを起動して、実際の処理実行はExcelVBAでやるなんてやり方は進めませんけど。
データを読み書きするExcelとマクロのファイルが同じで、データ量多いとべらぼうにCPU占有率とメモリ負荷が増大するので。
引用返信 編集キー/
■92532 / inTopicNo.5)  Re[4]: excelの最終行を特定したい
□投稿者/ furu (9回)-(2019/10/02(Wed) 21:50:39)
2019/10/03(Thu) 09:23:26 編集(投稿者)
C#素人Bさんのやり方でこんな感じ
行数多ければVBAに勝てるかも

var ファイルパス = @"aaa.xlsx";
var 指定セル = "B15";
int? 最終行;

var classType = Type.GetTypeFromProgID("Excel.Application");
dynamic excel = Activator.CreateInstance(classType);

excel.Visible = false;
	
dynamic workbooks = excel.Workbooks;
dynamic workbook = workbooks.Open(ファイルパス);
dynamic worksheets = workbook.Worksheets;
dynamic worksheet = worksheets[1];
dynamic cells = worksheet.Cells;
	
dynamic startCell = cells.Range[指定セル];
var column = Convert.ToInt32(startCell.Column);
var startRow = Convert.ToInt32(startCell.Row);

dynamic lastCell = cells.SpecialCells(11);
var endRow = Convert.ToInt32(lastCell.Row);

dynamic endCell = cells[endRow, column];

var range = cells.Range[startCell, endCell];

var data = (object[,])range.value;

最終行 = null;
for (var i = data.GetLength(0); i >= 1; i--)
{
	if (data[i, 1] != null)
	{
		最終行 = i + startRow - 1;
		break;
	}
}

workbook.Close(false);
	
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(endCell);
System.Runtime.InteropServices.Marshal.ReleaseComObject(lastCell);
System.Runtime.InteropServices.Marshal.ReleaseComObject(startCell);
System.Runtime.InteropServices.Marshal.ReleaseComObject(cells);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);

excel.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

アンドロイド9さんのやり方だと
空行あっても大丈夫?

引用返信 編集キー/
■92548 / inTopicNo.6)  Re[5]: excelの最終行を特定したい
□投稿者/ 大谷刑部 (32回)-(2019/10/04(Fri) 13:37:35)
No92532 (furu さん) に返信
> 2019/10/03(Thu) 09:23:26 編集(投稿者)
> アンドロイド9さんのやり方だと
> 空行あっても大丈夫?

「空行」に何もセルの情報がなければ大丈夫。
罫線あり:×
セル選択:×
そのセルに一回も入力も設定もしてない:○
入力したセルをdeleteキー等でクリアしたかつファイルセーブ前:×

今はまた仕様が変わっているかもしれませんが、
VBA 6.xx の時点では、
empty値   :emptyという値ありの状態
長さ0文字列(vbNullstring):値なしの状態
として扱われていたかと思います。

手動操作で言えば、[ctrl]+[end]で移動する場所がendプロパティーのセル位置かと。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ