2014年6月30日月曜日

シートの枚数を調べる。

 寄り道をしてみた。
 左下に表示されている「シート 1/7」と表示されている「7」を拾うのだ。




 コードは以下のとおり。

Sub main
    oSheets= ThisComponent.Sheets
    oNum = oSheets.getCount()
    oDisp = "Sheet の全枚数は " & oNum & " 枚です。"
    msgbox oDisp,0,"Sheet枚数取得"
End Sub

 これでシートの追加を先頭ではなくて最後にすることが出来るな。

 ついでに変数の型を定義しなくても変数を使えるということで試してみた。
 今回のようにちょっと試していくのには便利だな。

2014年6月29日日曜日

シートを削除してみた。

今回のコードは以下のとおり。
 実際に削除するコードは oSheets.removeByName( sSheetName ) である。

Sub Main
  Dim oSheets As Object
  Dim sSheetName As String
  Dim nReturnCode As Integer

  oSheets = ThisComponent.getSheets()
  sSheetName = "NewSheet"
  If oSheets.hasByName( sSheetName ) Then
    nReturnCode=Msgbox("本当に削除しますか?",4)
      if nReturnCode=6 then
        oSheets.removeByName( sSheetName )
      Endif
  else
    msgbox("削除するsheetがありません") 
  End If
End Sub


 この NewSheet がバッサリと削除されるのである。





 当たり前のことだけど削除したシートをもう一度削除しようとしても削除対象がないので出来ない。


 こうしてシートを挿入したり削除したりすることが出来るようになると一時的な作業用シートの完成だな。

 さて次はセルの値を元にしてデータベースのレコードを取得してみようか。

 と思ったけれど先にセル範囲を指定してのデータのクリアだな。
 レコードを取得しても書き込み先がきれいになっていなければ混乱のもとだ。

2014年6月28日土曜日

新しいシートを挿入する。

 マクロの動作結果は以下のとおり。






 コードは以下のとおり。

Sub Main
Dim oSheet As Object
Dim oShtName As String
Dim oDisp as String
  oSheet = ThisComponent.getSheets()
  oShtName = "NewSheet"
  oDisp = "新規Sheet : " & oShtName '& Chr$(10)
  If NOT oSheet.hasByName( oShtName ) Then
  oSheet.insertNewByName( oShtName, 0 )
  oDisp = oDisp & "が挿入されました"
  else
  oDisp = oDisp & "は既に存在しています"
  End If
  msgbox oDisp, 0, "Sheetの挿入"
End Sub


 シートを挿入する前に同一名称のシートがあるかどうかをチェックしている。
 なければ oSheet.insertNewByName( oShtName, 0 ) でシートを先頭に挿入している。

 挿入したシートの使い方としては作業用と出力用の複数を使う予定なので同一名称のシートがある場合には削除をしておきたいので次回はシートの削除だな。

 あとは挿入したいシートを先頭ではなくて最後にするにはどうするのだろうか。
 シートを挿入する場所を指定しているからシートの総数を調べる方法があればできそうだな。

2014年6月26日木曜日

Cellから値を取得する

 いよいよ「Cellから値を取得する」
http://openoffice3.web.fc2.com/OOoBasic_Calc.html#OOoCCB02a

 これが出来るようになるとやりたいことに近づく。

 今回動かしたコードは以下のとおり。
Sub Main

Dim Doc, Sheet As Object
Dim Cell As Variant

Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Sheet7")

Cell = Sheet.getCellByPosition(0, 0).Value
msgbox("Sheet.getCellByPosition(0, 0).Value = " & Cell)
Cell = Sheet.getCellByPosition(0, 0).String 
msgbox("Sheet.getCellByPosition(0, 0).String = " & Cell)
Cell = Sheet.getCellByPosition(0, 0).Formula 
msgbox("Sheet.getCellByPosition(0, 0).Formula = " & Cell)

End Sub

 実行結果は以下のとおり。




 取得する形式をきちんと指定しないと想定した値が入ってこないのには注意が必要だな。

 それはさておき。
 Value と Formula の結果が理解出来ていないのは問題だな。


Option VBASupport 1 が邪魔である。

 新しいマクロを開くと次の一文が出てきて鬱陶しい。
Option VBASupport 1


 消し方をググってみた。
 やってみた。
 OpenOffice のオプションにある VBA 属性にある Excel 関連にあるチェックボックスをすべてオフにする。


 上の設定を終えてから新しいマクロを開いてみるとすっきりした画面がでてきた。
 やっぱりこうでなくては。

2014年6月24日火曜日

OpenOffice Basic で Calc のセルに数字を入れてみる。

 おっしゃ。
 出来たついでに色々なパターンを試してみた。



Cell = Sheet.getCellByPosition(1, 20)
Cell.Value = 20
Cell = Sheet.getCellByPosition(2, 20)
Cell.Value = "21"
Cell = Sheet.getCellByPosition(3, 20)
Cell.String = 22


 数値をダブルクオーテーションでくくっても入力できた。
 制限はあるようだが文字列をダブルクオーテーションでくくらなくても入力できた。

 さて統一をしておきたいがどうすればいいのやら。

面白そうなサイトを見つけた。

 EXCEL VBAからOOo Basicへの移行について
http://freeopenoffice.jimdo.com/openoffice-org%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C%E8%A7%A3%E8%AA%AC/

 ちょっと見に行ってくる。

 VBA との比較だった。
 VBA は詳しくないので残念ながら参考にならなかった。

 次に行こう。

OpenOffice Basic で Calc のセルに文字を入れてみる。

 実行前後のスクリーンショット。



 指定したセル A21 へ文字列を入れることが出来た。
 セルの指定が座標 0,20 になっているけれど見た目でわかるように A21 といった形で表現できないだろうか。

 実行したマクロは以下のとおり。

Option VBASupport 1

Sub TEST
Dim Doc As Object
Dim Sheet As Object
Dim NewColumn As Object

Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Sheet7")

Cell = Sheet.getCellByPosition(0, 20)
Cell.String = "0,20"

End Sub


 今回のポイントは二点。

 まずは「Doc = ThisComponent」
 こうすることで Basic IDE から実行してもランタイムエラーが発生しなくなる。
 サンプルでよくある「Doc = StarDesktop.CurrentComponent」だと Basic IDE から実行するとランタイムエラーが発生する。
 プッシュボタンを作らなくてもマクロを実行することが出来るのでとても便利である。

 もう一つは「Sheet = Doc.Sheets.getByName("Sheet7")」
 シートの名称からシートを選択することが出来る。
 当初は getByName が抜けていて何回もマクロを実行しても反応がなかった。
 合っているとの思い込みがあったのでサンプルコードを何度も見返してようやく気がついたという次第。

 次は指定したセルに数字を入れてみよう。


 このマクロで気になっていた Option VBASupport 1 は VBA  コマンドを使えるようにするものらしい。
 目指すは脱 VBA なのでここは 0 にしておこう。

2014年6月23日月曜日

Calc でボタンをクリックしてマクロを動かす。

 マクロ自体は大したことはやっていないが Excel でやっているようにボタンを押したら動くようにした。

Rem Attribute VBA_ModuleType=VBADocumentModule
Option VBASupport 1

Sub TEST
Dim Doc As Object
Dim Sheet As Object
Dim NewColumn As Object

rem Doc = StarDesktop.CurrentComponent
Doc = ThisComponent
Sheet = Doc.Sheets("Sheet7")

msgbox "TEST"
End Sub


 まずは「表示」-「ツールバー」-「フォームコントロール」を選択する。

 するとフォームコントロールのウインドウが表示される。 

 デザインモードをオンにしてプッシュボタンを配置する。

 配置したプッシュボタンを右クリックしてメニューからコントロールを選択する。

 マクロセレクターなウインドウが表示されるので実行したいマクロを選択する。

 選択したマクロを動かすタイミングは実行時。
 マウスボタンを押した時ではダメなのだろうか。

 実行結果は予想通りで問題なし。

 今日は見えないところではなくて見栄えをいじったのでちょっと面白かった。
 

2014年6月22日日曜日

セルと範囲

https://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Cells_and_Ranges

StarDesktop.CurrentComponent は現在のコンポーネントを返します。BASIC IDE で作業している場合、マクロを実行すると、BASIC IDE が返されます。BASIC IDE には表計算ドキュメントコンポーネントがないため、RunTime エラーが生成されます。

 今までは Basic 上だけのことだったの気にしていなかったけれど今度はセルをいじるためばっちりとハマりました。
 さてどうやって対応するんだろうか。

Excel&SQLite から Calc&Base へ行こうっと

 いまは Windows XP 上で Excel と MySQL で連携して作業しているものがある。
 これを脱 Windows XP と合わせて Calc と Base へ移行しようとしているわけだ。
 Calc はよく使っているが Basic と Base は使い始めたばかりでググってばかりだ。

 Excel では簡単なマクロを動かして MySQL へアクセスしているのでこれを Basic へ移行する必要がある。
 懸案となっていた Calc から Base へのアクセスはあっけなく出来た。
 次は Calc のワークシートやセルを操作する必要があるのでドキュメントを探してみた。

 たぶんここにある「表計算ドキュメント」を読み進めればいいのかな。
https://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Spreadsheets

 読み進めていきたいところだけれども今日は時間切れなのでここまで。
 Ctrl + D でブックマークしておこう。

 別件で Excel と SQLite を使い始めているがこっちも Calc と Base で進めていったほうが楽になるかな。

 データベースといっても所詮は素人考えで Excel の表をそのまんまコピペしているだけ。
 昔は正規化うんぬんで悩んで結局何も出来なかったことから正規化とかは今やっていることが出来るようになってからの事としている。
 このことに気がつくまでだいぶ時間がかかってしまった。

 一人でやっていると泥沼にハマっていることに気が付かずそのまま進んでしまうのがアカンて。
 勉強会とかあったら参加したいものである。

UNO

 UNO って単語が OpenOffice のドキュメントで出てくるからカードゲームでもやるのかなと冗談交じりに思っていたら Universal Network Objects という重要なものであった。

 やっぱ短縮されていた言葉だったんだな。

脱 Excel を目指して続きを読んでいくか。
https://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/API_Intro

 今更ながら気がついたけど com.sun.star ってそういえば元は SUN の StarOffice だったっけ。

OpenOffice.org Basicからデータベースにアクセスする


 こちらのサイトを参考にしてサンプルコードをコピペして名称を変更して実行してみた。
http://itref.fc2web.com/openoffice/basic/base.html

Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("DataBaseFile")
Connection = DataSource.getConnection("", "")

Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("select * from Table")

If IsNull(ResultSet) Then
  MsgBox "検索されたレコード件数が0件"
Else
  While ResultSet.next
    sValue1 = ResultSet.getString(1)
    sValue2 = ResultSet.getLong(2)
  Wend
End If

Statement.Close()
Connection.Close()
Connection.Dispose()


 案の定エラーが発生。


 エラーメッセージはステートメントにあるテーブルが見つからないとのこと。
 テーブルが見つからないということは登録してあるデータベースへのアクセスはできているようだ。
 なら登録してあるデータベースを Base を起動して確認してみると該当のテーブルは作成済みである。
 んー。
 もしやと思いテーブル名称 Table を TestTable へ変更した。もちろん Basic 側も変更した。
 そして実行すると先ほどのエラーメッセージではなくて違うエラーメッセージが表示された。

 今度のエラーはテーブルから取得したデータは文字列だけどステートメントは整数になっているから data type が違うって言ってる。
 なので sValue2 = ResultSet.getString(2) にしてあげれば解決。

 あっけないくらいに Basic からデータベースへアクセスできるようになった。
 OpenOffice のオプションからデータベースの登録作業は必要ではあるがドライバのインストールが不要なのは良いことだ。

 次はテーブルから取得したデータを指定したセルへ入れたり次のレコードを読んだり出来るようにしてみよう。

 そういえばデータベースファイルはローカルを指定しているがネットワークドライブ越しのデータベースファイルを指定することは可能なのだろうか。
 気になる気になる。

Windows8 のコマンドプロンプト (管理者)

 すべてのプログラムから探してみたけど見つからなかったので調べてみたらそんなところにあるのかと思い知らされる。

 「Windows」キーを押しながら「X」キー

 やりたかったことはタッチキーボードが何度も何度も復活してくるのでトドメを刺したかった。
 物理キーボードがあるんだからタッチキーボードなんぞはいらん。
 新しい機能をつけるのはいいがこういうところに気がまわらないのはマイクルソフトらしい。

C:\Windows\system32>net stop TabletInputService
Touch Keyboard and Handwriting Panel Service サービスは開始されていません。

NET HELPMSG 3521 と入力すると、より詳しい説明が得られます。


C:\Windows\system32>sc config TabletInputService start= disabled
[SC] ChangeServiceConfig SUCCESS

C:\Windows\system32>

 さてこれでトドメになったのだろうか。
 次の再起動後が楽しみである。

 まあメッセージを読む限り今の状況と変わっていないと思うが。

2014年6月21日土曜日

OpenOffice Base へコピペするときの日付に注意。

 Excel で作ったデータを Base へコピペしてみたんだけど次のウインドウが出てきてコピペができなかった。


 Excel 形式が問題なのかなと思って Calc 形式にして見たけれど結果は予想通り出来なかった。

 ぐぐってみると次のページが見つかった。
OpenOffice 3.4.1、普段よく使わないデータベースソフト、「Base」のメモ書き
http://ameblo.jp/i-yumekibun/entry-11521866111.html

 ここに書いてあった日付の書式を YYYY/MM/DD にしてみてコピペしたらできた。
 でもなんで日付の書式を変えたら出来るようになったんだろうか。

 さっきのページにはデータ入力をフォームを使って出来るようにしていたのでやってみよっと。

 コピペしたデータを確認したらテーブルに入っていたデータがおかしくなっていた。
 全部のデータが入っていないだけではなく同じレコードが重複して入っていたりして使えないテーブルでした。
 なのでざっくり削除した。

 そしたら Calc と Base が起動しなくなってしまった。
 アクセスランプは点滅するから読み込みはしているんだろうけど。
 再起動してダメだったら OpenOffice を再インストールか。

2014年6月16日月曜日

OpenOffice Calc のデータを Base にコピペする。

 テーブルを選択してコピペっていうのがわからなかったけれどゴチャゴチャとしているうちにできた。


 コピペする Calc のデータとテーブル名称とプライマリキーの設定を間違えた。
 ほとんど間違えたと言ってもいいだろう。
 でもコピペのやり方がわかったからよしとしよう。

Apache OpenOffice 4.0.1 - Calc のプルダウンメニューは

 どうにも見つからなかったので出来る方法で解決することにした。

 まずは「仕入先コード」のレイアウトを変更した。
 当初は vlookup で「仕入先」を検索してその左にある「仕入先コード」を取得する予定であったが vlookup の仕様で一番左の列を検索するためその左にある列を拾うことができない。
 なので拾いたい列を右へ移動させた。



 さて次は「部品リスト」で一工夫をする。
 見栄えよくしたかったが目的を達成できなければ意味がないので先へ進むのだ。
 選択させたい「仕入先選択」を欄外へ移動させてそこで入力させる。
 そして「仕入先コード」の列へ数式「=VLOOKUP(H2;仕入先コード.A1:D99;4;0)」を入れて完了。


 やはり見栄えは気になるができたので良しとする。

初夏の Skype クレジット増額プレゼント キャンペーン

http://blogs.skype.com/2014/05/22/ja-circleksunkus_2014_summer/

 こんなキャンペーンをやっていたのか。
 Skype クレジットを追加に行かなければ全く知らないままだったな。

 三千円分を購入したらプリペイド番号が三千円と五百円の二つが印字されていた。
 来年の五月まで有効だから五百円分は残しておこうっと。


2014年6月15日日曜日

Apache OpenOffice 4.0.1 - Calc のプルダウンメニュー

 Calc で部品リストの仕入先コードをプルダウンメニューから選択して数値を入力したい。





 上の画像のように単に仕入先コードの数値だけをリストにして選択することはできた。
 それだと仕入先と対応する仕入先コードを知っていることが前提になっているので選択する意味がない。
 プルダウンメニューから仕入先を選択して仕入先コードを入力したいのだがどうやってやるんだろうか。
 もう少し調べてみよう。

 なおテストデータなのでデータ自体はあちらこちらからのコピペである。

MELSECNET/HのリモートI/O局経由のMODBUS(R)通信について

http://fa-faq.mitsubishielectric.co.jp/faq/show/13661  別ネットワークの先にぶら下げるってどういうことだろう。