2012年11月19日月曜日

VBAで設定ファイルの読み込み

なんとなく設定ファイルを読み込む関数を作ろうかと思って書いてみた。
Dictionaryで返します。


Option Explicit

'設定ファイルを読み込んでDictionaryで返す
Public Function GetConfig(strFileName)
  Dim RegExp    'VBScript_RegExp_55.RegExp
  Dim Match     'VBScript_RegExp_55.Match
  Dim Matches   'VBScript_RegExp_55.MatchCollection
  Dim dict      'Scripting.Dictionary
  Dim fso       'Scripting.FileSystemObject
  Dim strData   'ファイルのデータ
  Dim i
  
  'RegExp Setting
  Set RegExp = CreateObject("VBScript.RegExp")
  RegExp.IgnoreCase = False '大文字小文字を区別する
  RegExp.Global = True
  RegExp.MultiLine = True   '複数行を対称にする
  RegExp.Pattern = "^(\S+)\s*=\s*(\S+)*\s*$"
  
  'Dictionary(keyは大文字小文字を区別する)
  Set dict = CreateObject("Scripting.Dictionary")
  
  'FilesyStemObject
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  'ファイルチェック
  If Not fso.FileExists(strFileName) Then
    Set GetConfig = dict
    Set dict = Nothing
    Set fso = Nothing
    Exit Function
  End If
  
  'ファイル読み込み
  With fso.OpenTextFile(strFileName)
    strData = .ReadAll
  End With
  Set fso = Nothing
  
  '取り出し
  Set Matches = RegExp.Execute(strData)
  For Each Match In Matches
    dict(Match.SubMatches(0)) = Match.SubMatches(1)
  Next
  
  Set GetConfig = dict
  
  Set RegExp = Nothing
  Set Matches = Nothing
  Set Match = Nothing
  Set dict = Nothing
End Function

一応、vbscriptも意識してみたつもり。

2012年9月30日日曜日

ExcelでJsonデータを取得する

どうにかエクセルでjsonデータを取得できないか考えて、いろいろ探しましたが、ScriptControlを使うものしか見つからなかったので、コロンブスの卵的な発想でVBAでIEのHTMLDocumentオブジェクトを作ってその内部でJavaScriptに処理してもらった後、結果をもらうことにしてみました。 以下コード。
Option Explicit

'Microsoft WinHTTP Services, version 5.1 に参照設定

'WinHttpRequest proxy settings.
Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0
Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0
Const HTTPREQUEST_PROXYSETTING_DIRECT = 1
Const HTTPREQUEST_PROXYSETTING_PROXY = 2
'Specifies when IWinHttpRequest uses credentials. Can be one of the following values.
Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = &H0
Const HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = &H1


Sub tweet_search_json()
  Dim req As New WinHttp.WinHttpRequest
  Dim js As String
  Dim doc As Object
  Dim obj As Object
  
  req.Option(WinHttpRequestOption_UserAgentString) = "Mozilla/4.0 "
  req.Open "GET", "http://search.twitter.com/search.json?q=okinawa", False
  req.Send
  
  'JavaScript
  js = "json = (<<json_response>>);" & _
       "for( var i in json.results){ " & _
           "var elm = document.createElement('div');" & _
           "elm.innerHTML = json.results[i].text;" & _
           "document.getElementsByTagName('body').item(0).appendChild(elm);" & _
       "}"
  
  'IEの HTMLDocument オブジェクトを作る
  Set doc = CreateObject("htmlfile")
  
  ' スクリプト実行
  doc.parentWindow.execScript Replace(js, "<<json_response>>", req.ResponseText), "JavaScript"
  For Each obj In doc.getElementsByTagName("div")
    Debug.Print obj.FirstChild.nodevalue
  Next
  
  Set req = Nothing
  Set doc = Nothing
  Set obj = Nothing
End Sub


「Microsoft WinHTTP」が必要です。(おそらくWin2000以降はインストールされているはず)

2012年1月11日水曜日

win機へubuntuをインストール

年末になんとなくubuntuを使いたくなったので、手元のノートパソコンへインスールすることにしました。
パソコンの仕様は
TOSHIBA dynabook BX(PABX33ML)
CPU インテル® Pentium® プロセッサー P6000(1.86GH)
チップセット インテル® HM55 Expres
HDD 320GB
メモリ 2GB
という、linuxには快適すぎる環境。適当に空きパーテーションをつくる。
Ubuntu9.04のCDがあったので、そのままインストール。
10.04LTSを入れたかったので、AlternateCD版をダウンロード・CD-Rへ焼いて再起動すると、「アップグレード対象外」との事。
9.10からなら一発で行けるそうなので、9.10のAlternateCD版をダウンロードして
$ mkdir /mnt/Alternate $ sudo mount -o loop ~/Desktop/ubuntu-09.10-alternate-i386.iso /mnt/Alternate
でマウント。
$ gksu "sh /mnt/Alternate/cdromupgrade"
するとなぜかリポジトリエラー。
なので、無理やり vi /etc/apt/sources.list して以下の行を追加。
deb file:/mnt/Alternate main
deb-src file:/mnt/Alternate main #必要か不明
保存したら、
$ sudo apt-get update
$ sudo apt-get dist-upgrade
でアップグレード実行。
今度はうまくいったので、さっき作った10.04LTSのAlternate版を使ってアップグレード
(今度はCD入れたら自動でやってくれました。)

でめたく10.04へアップグレードして再起動すると。Xが真っ黒。
手探りでユーザ名とパスワード入れるとXは立ち上がっている模様。
チップセットが対応していないようなので、リカバリーモードで起動してX.orgを書き換え。
この辺を参考に
Section "Device"
Identifier "Configured Video Device"
Driver "vesa"
EndSection
とかしながら、何とか低グラフィックモードで起動できたので、
$sudo apt-get update
$sudo apt-get upgrade
すると認識して通常通り起動しました。
bootまわりはここを参照。

あとはAcpiまわりを対策すれば完璧。

2012年1月10日火曜日