• 会社案内
  • 事業内容
  • 事業実績
  • ブログ・SNS
  • スタッフ募集
  • 校正学校
  • お問い合わせ
2. 値の入っているセルの行数を調べる
データが何行あるのか知りたいとき、Excel(VBA)ではEndプロパティやCurrentRegionプロパティを使っていると思います。Calc(OOoBasic)にはこれらのプロパティが用意されていないので、別の方法を使います。


* * *


■例1<データが一まとめになっている場合>

例えばこんなシートがあったとします。
(左の数字は行番号、右の文字列はA列の内容)

1 北海道
2 青森
3 岩手
4 秋田
5 宮城
6 山形
7 福島
8
9
・ (8行目以下は空)


65536

ここで、最後のデータ "福島" が入っているA7セルを得るには、VBAだと

Range("A65536").End(xlUp)

でできました。そして、

Range("A65536").End(xlUp).Row

で得られる行番号(7)がデータの行数になります。



では、OOoBasicで行数を知るためのコードを書いてみます。
(oSheetは該当シートのシートオブジェクト)

oColumn = oSheet.getColumns().getByIndex(0)
oRanges = oColumn.queryContentCells(31)
nRangeCount = oRanges.getCount()

If nRangeCount = 0 Then
nRowCount = 0
Else
oRange = oRanges.getByIndex(0)
nRowCount = oRange.getRows().getCount()
End If

queryContentCellsというメソッドを使って、A列の全セルの中で値の入っている領域を調べ、その行数を取得しています。変数nRowCountの値がデータの行数です。

それでは、各行で何をやっているのか順に説明していきます。

まず、oSheet.getColumns().getByIndex(0)でシートのA列全体を取得し、その列オブジェクトに対してqueryContentCellsメソッド(引数の数字については下の補足を参照)を実行します。このメソッドは、対象セルの中から値の入っているセル範囲を探して返します。その戻り値は、「値の入っている一続きのセル範囲」を1つの領域として、それらの領域のコレクション(集合)になっています。この戻り値をoRangesに代入します。

上の例だと、1行目の"北海道"から7行目の"福島"まで一続きになっていて、それより下には値が入っていません。ですからqueryContentCellsメソッドは要素数1の集合を返し、その要素はセル範囲「A1:A7」になっているわけです。

次に、oRanges.getCount()で要素数を調べます。

要素数が0ならA列はすべて空なので、データの行数nRowCountは0とします。

要素があったらoRanges.getByIndex(0)で1番目の要素(この例ではデータは一まとめになっているという前提なので唯一の要素)にアクセスし、その要素、つまりセル範囲をoRangeに代入します。最後に、oRange.getRows().getCount()で行数を取得してnRowCountに代入します。

※oRangesとoRangeの違いに注意してください。queryContentCellsメソッドの戻り値を代入するoRangesはセル範囲の集合です。一方oRangeはoRangesの中の個々のセル範囲です。



■例2<データが飛び飛びになっている場合>

今度はデータの間に空行が入っている例です。
(左の数字は行番号、右の文字列はA列の内容)

1 北海道
2
3 青森
4 岩手
5 秋田
6
7 宮城
8 山形
9 福島
10
11
・ (10行目以下は空)


65536

この例の場合、「値の入っている一続きのセル範囲」が3つあるので、queryContentCellsメソッドは要素数3の集合を返します。要素となっているセル範囲は、"北海道"の「A1」、"青森" "岩手" "秋田"の「A3:A5」、"宮城" "山形" "福島"の「A7:A9」、以上の3つです。

そこで、データの合計行数を知るにはこんなコードが考えられます。

oColumn = oSheet.getColumns().getByIndex(0)
oRanges = oColumn.queryContentCells(31)
nRangeCount = oRanges.getCount()

nRowCount = 0
For i = 0 To nRangeCount - 1
oRange = oRanges.getByIndex(i)
nRowCount = nRowCount + oRange.getRows().getCount()
Next

oRangesの要素となっている各セル範囲oRangeの行数をカウントしていくという方法です。これでデータの行数7が得られます。



では続いて、データの行数ではなく一番下の "福島" が入っているセルの行番号が知りたい、という場合のコード例を挙げます。

oColumn = oSheet.getColumns().getByIndex(0)
oRanges = oColumn.queryContentCells(31)
nRangeCount = oRanges.getCount()

If nRangeCount = 0 Then
nBottomRow = -1
Else
oRange = oRanges.getByIndex(nRangeCount - 1)
nBottomRow = oRange.getRangeAddress().EndRow
End If

まず要素数が0、つまりデータが1行もないときは、最終の行番号を表す変数nBottomRowを-1と答えるようにしました。この仕様はあくまで一例です。

次に、要素があったときです。ここでoRanges.getByIndex(nRangeCount - 1)とすることで、oRangesの最後の要素、つまり一番下にある「値の入っている一続きのセル範囲」(この場合「A7:A9」)が得られます。そのセル範囲の最終行を調べれば、それが知りたかった行番号、というわけです。OOoBasicでは行番号や列番号は0から始まるので、この例の場合は最終の行番号として8が得られます。


* * *


※補足

・queryContentCellsメソッドの引数の数字

queryContentCells(31)の31などの数字は、clearContents(31)のものと同じで、どういうセルを該当させるかを指定するための引数です。今回紹介したコードでは、実質的な内容を持つセルを指定するために以下の1〜16を合計した31という数字を使いました。

1:数値
2:日付と時刻
4:文字列
8:コメント
16:数式
32:セルに直接設定された書式
64:スタイルによる書式(間接書式)
128:図形描画オブジェクト
256:セル内の一部の文字列に設定された書式

注)queryContentCellsメソッドでは32以上の指定がうまくいきません。また、clearContentsメソッドでは64が32と変わらないのですが、2つ合わせた96だと正しく機能してくれます。





文責:磯部

このブログは神楽坂の校正・校閲プロダクション鴎来堂(おうらいどう)が運営しています
URL:http://www.ouraidou.net/



鴎来堂では校正者を募集しています
[1]在宅校正者:一般書籍(文芸・実用)の校正・校閲・原稿整理
[2]派遣校正者:都内出版社・印刷所への出張校正
[3]OCRオペレータ:電子書籍関連業務 校正、タグ修正など
[4]内勤(アルバイト):事務作業、ゲラ(校正刷り)配達等の手伝い
[5]DTPオペレータ:在宅、内勤問わず
募集フォームよりお申し込みください
※[3][4]は定員に達した為、現在募集を見合わせております
URL:http://www.ouraidou.net/form.htm/

| blog-ouraidou | OpenOffice.org | 11:13 | comments(0) | trackbacks(0) |
サイトの紹介
神楽坂で一番のオープンオフィス使い(当社比)の
鴎来堂校閲部イソベ氏が参考資料をアップしました。

===以下イソベレポート======================

OOoBasicについてのWebサイトの追加情報です。

OpenOffice.org Basic and StarBasic
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic

UNIX USER誌(ソフトバンクパブリッシング刊)の記事
http://oooug.jp/compati/unixuser/index.html

短期連載「OpenOffice.org 操縦術」(日経Linux)
http://bd.tank.jp/nikkei/

OpenOffice.org Basicでガントチャート
http://shinob.blog42.fc2.com/

StarSuite 8 Basic プログラミングガイド
http://docs.sun.com/app/docs/doc/819-1332?l=ja

===以上イソベレポート======================

そして、鴎来堂ブログもお忘れなく!




文責:磯部・鵬

このブログは神楽坂の校正・校閲プロダクション鴎来堂(おうらいどう)が運営しています
URL:http://www.ouraidou.net/



鴎来堂では校正者を募集しています
[1]在宅校正者:一般書籍(文芸・実用)の校正・校閲・原稿整理
[2]派遣校正者:都内出版社・印刷所への出張校正
[3]OCRオペレータ:電子書籍関連業務 校正、タグ修正など
[4]内勤(アルバイト):事務作業、ゲラ(校正刷り)配達等の手伝い
[5]DTPオペレータ:在宅、内勤問わず
募集フォームよりお申し込みください
※[3][4]は定員に達した為、現在募集を見合わせております
URL:http://www.ouraidou.net/form.htm/

| blog-ouraidou | OpenOffice.org | 15:40 | comments(0) | trackbacks(0) |
1. テキストファイル(CSVファイル)を開く
「OpenOffice.org」をご存じでしょうか。
「Microsoft Office」との互換性を持つ、
ワープロや表計算などを統合したオフィスソフトです。
しかもタダ!(松本零士センセ風)

「OpenOffice.org」は、
「オープンオフィス」「OOo(オーオーオー)」
なんて読みます。

公式サイトはこちらです。
ダウンロードもこちらから出来ます。

「Microsoft Office」との互換性を謳ってはいますが、
鴎来堂の場合、著者先生の原稿をお預かりするので、
万が一がを想定して、同じアプリケーションで開くようにしています。

「Word」原稿は「Word」で、
「一太郎」原稿は「一太郎」で、
「WinのInDesign」ゲラは「WinのInDesign」で開くようにしています。

お客さんのご都合があるので、
複数のプラットホームを無くすことは出来ないのですが、
「OOo」はどんどん便利になってきているので、
鴎来堂では通常業務を「OOo」に移行していこうと思っています。
「OOo」のロゴにかもめが飛んでいるのも鴎来堂向きですよね。


さて、コンピュータはかわいい奴です。
うまく使える場面で、うまく使うと、うまいこと仕事がはかどります。

校正の王道は校正者の職人技なのですが、
やっぱり昨今コンピュータに頼る場面も多いですね。

鴎来堂では「一太郎」や「Excel」などの「マクロ」を使って、
校正のいろんな場面で省力化をしてきました。
(テキストのデータ処理なら鴎来堂にお任せください)


で、「OOo Calc」(Microsoft OfficeにおけるExcel」でも
同じようなことがやりたくなりますよね。
表側が同じようにみえるので、
ExcelでVBAがいじれれば何とかなるだろうと思ったらそれが大間違い。
違うシートを参照するだけでも関数が違ったりして、結構苦労しました。

といっても苦労したのは僕じゃなくって、
鴎来堂理系頭脳のトップ、イソベ氏です。

彼が言うには、
「とにかく資料の絶対数がたりない」とのこと。

たとえば、
OOoBasicの基本事項についてはこちらのサイトがおすすめです。
OpenOffice.org Basic 研究室

「OpenOffice.org Basic」(OOoBasic)では、
素晴らしいサイトもありますが、
もっと有志がいてもいいですよね。

鴎来堂ブログでも、OOoを盛り上げるため、
不定期に実戦的なソースを載っけていきます。

軽佻浮薄を身上とする僕の文章とは逆に、
骨太のイソベレポートにメロメロだ!!


===以下イソベレポート======================
OOoのCalcでカンマ区切りのテキストファイルを開くマクロを作ってみます。


* * *


まずはExcel(VBA)でのコード例です。

Workbooks.OpenText FileName:="C:¥Data¥File1.txt", StartRow:=2, _
DataType:=xlDelimited, Comma:=True, Tab:=False, _
TextQualifier:=xlDoubleQuote, _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2))

引数の意味を簡単に記しておきます。



FileName:="C:¥Data¥File1.txt"

読み込むファイルのファイル名。



StartRow:=2

2行目のデータから読み込む。



DataType:=xlDelimited

各行は区切り文字(デリミタ)で区切られている。



Comma:=True, Tab:=False

カンマを区切り文字にする。
タブ(デフォルトで有効になっている)は区切り文字にしない。



TextQualifier:=xlDoubleQuote

文字列の引用符はダブルクォート。



FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2))

1列目と2列目は標準のセル書式で、3列目は文字列として読み込む。


* * *


さて、上のコードがCalc(OOoBasic)だとこうなります。

Dim aFileProperties(1) As New com.sun.star.beans.PropertyValue

aFileProperties(0).Name = "FilterName"
aFileProperties(0).Value = "Text - txt - csv (StarCalc)"
aFileProperties(1).Name = "FilterOptions"
aFileProperties(1).Value = "44,34,0,2,1/1/2/1/3/2"

StarDesktop.loadComponentFromURL(ConvertToUrl("C:¥Data¥File1.txt"), _
"_blank", 0, aFileProperties())

VBAで意味上は1行のステートメントが、OOoBasicでは変数の宣言を除いても5行に増えています。OOoBasicではよくあるパターンで、「メソッドが動作するときのオプションを前もって変数に設定しておいて、メソッドを呼び出すときにその変数を引数として渡す」という手法です。

この場合だと、aFileProperties()という配列変数(構造体の配列)を用意して、これのNameメンバーに「設定の種類」を表す文字列を、Valueメンバーに「設定値」を表す文字列を入れています。そしてこのaFileProperties()を、ドキュメントを開くためのloadComponentFromURLというメソッドの4つ目の引数にするわけです。

では、その設定の部分を見ていきます。



aFileProperties(0).Name = "FilterName"
aFileProperties(0).Value = "Text - txt - csv (StarCalc)"

この2行は、開くファイルがテキストファイルであることを表しています。"Text - txt - csv (StarCalc)" という文字列は正確にこの通りにしなければなりません。



aFileProperties(1).Name = "FilterOptions"
aFileProperties(1).Value = "44,34,0,2,1/1/2/1/3/2"

この2行で読み込み方法の詳細な設定をしています。この暗号のような "44,34,0,2,1/1/2/1/3/2" という文字列の意味を、カンマで分けられた部分ごとにVBAと対応させながら解読してみます。



44

区切り文字のASCIIコードです。
カンマは44、タブは9、セミコロンは59、スペースは32。
◆VBAの DataType:=xlDelimited, Comma:=True に相当

連続した区切り文字を1文字として扱うときは /MRG を付けます。
(例:カンマの場合 44/MRG)
◆VBAの ConsecutiveDelimiter:=True に相当

また、区切り文字が複数あるときは / に続けて書き加えます。
(例:カンマかセミコロンなら 44/59)

※データが固定長で区切られている(◆VBAの DataType:=xlFixedWidth)ときは、ここを FIX とします。詳しくは一番下の補足を参照してください。



34

文字列の引用符のASCIIコードです。
ダブルクォートは34、シングルクォートは39、ない場合は省略。
◆VBAの TextQualifier:=xlDoubleQuote に相当



0

文字コードセットの指定です。
0でOSの標準の文字コードセットを使用します。
Unicode(UTF-16)は65535、UTF-7は75、UTF-8は76、EUC-JPは69、ISO-2022-JPは72、Shift_JISは64。
◆VBA(Excel2002以降)の Origin:=932 などに相当



2

2行目のデータから読み込みます。
◆VBAの StartRow:=2 に相当



1/1/2/1/3/2

列ごとに書式を指定します。
列番号/書式/列番号/書式/・・・という風に書きます。
この例の場合、
1列目は標準の書式で(→ 1/1)
2列目も標準の書式で(→ 2/1)
3列目は文字列として(→ 3/2)
読み込む、という意味です。
標準は1、文字列は2、MDY形式の日付は3、DMY形式の日付は4、YMD形式の日付は5、無視する(読み込まない)列は9。
◆VBAの FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2)) に相当
 VBAと同様に、指定しなかった列は標準で読み込まれる


* * *


※補足

・ExcelでCSVファイルを開くとき

Excelでファイルの拡張子が.csvのファイルを開くと、テキストファイル・ウィザードが起動せず、勝手にすべての列が標準の書式で読み込まれてしまいます。VBAのOpenTextメソッドでも引数のFieldInfoが有効にならないので、やはり全列が標準の書式で読み込まれます。FieldInfoを使いたいときは、名前変更するなりコピーするなりして拡張子が.csvでないファイルを用意する必要があります。



・文字列の引用符(TextQualifier)について

文字列の引用符とは「文字列を囲っているかもしれない記号」のことです。
例えば、カンマ区切りのテキストファイルの
ABC,"DEF,GHI",JKL
という行を読み込むと、TextQualifier の指定によって結果に次のような違いが出ます。

TextQualifier:=xlDoubleQuote のとき
列1:ABC  列2:DEF,GHI  列3:JKL

TextQualifier:=xlNone のとき
列1:ABC  列2:"DEF  列3:GHI"  列4:JKL



・固定長のデータを読み込むOOoBasicのコード

データが固定長で区切られているときは、例の暗号のような文字列の最初の部分(区切り文字のASCIIコードを指定する所)に FIX と入れます。書式の指定は 位置/書式/位置/書式/・・・という風に書きます。
例えば、
DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 2), Array(10, 9), Array(15, 1))
に対応する「暗号」は、
"FIX,,0,1,0/2/10/9/15/1"
となります。

===以上イソベレポート======================

ね、骨太でしょ。
次回の予定が決まったら、またお知らせしますね。

*ソースはイソベ氏のオリジナルです。
参考にするときは「イソベさんありがとう!」
と口にしてから使ってあげてください。

*鴎来堂ブログは横幅が狭いので、
ちょっと見にくいかもしれません。
ソースはテキストエディタなどで見るとよいですね。



文責:磯部・鵬

このブログは神楽坂の校正・校閲プロダクション鴎来堂(おうらいどう)が運営しています
URL:http://www.ouraidou.net/



鴎来堂では校正者を募集しています
[1]在宅校正者:一般書籍(文芸・実用)の校正・校閲・原稿整理
[2]派遣校正者:都内出版社・印刷所への出張校正
[3]OCRオペレータ:電子書籍関連業務 校正、タグ修正など
[4]内勤(アルバイト):事務作業、ゲラ(校正刷り)配達等の手伝い
[5]DTPオペレータ:在宅、内勤問わず
募集フォームよりお申し込みください
※[3][4]は定員に達した為、現在募集を見合わせております
URL:http://www.ouraidou.net/form.htm/

| blog-ouraidou | OpenOffice.org | 20:54 | comments(1) | trackbacks(0) |
   1234
567891011
12131415161718
19202122232425
2627282930  
<< November 2017 >>
_