SQLの窓

2017年07月25日


VBA : 挿入した『テキストボックス』にアクセスする



テキストボックスを挿入して、『オブジェクトと選択の表示』で一番下へ持って行って、コレクションの先頭に来るようにします( コレクションを For Each してもいいですが、ストレートに )

処理
Sub ボタン3_Click()


    MsgBox ActiveSheet.Shapes(1).TextFrame2.TextRange.Text
    
    Dim json As String
    
    json = "{" & vbCrLf
    json = json & vbTab & """link"": ""https://www.google.co.jp/""," & vbCrLf
    json = json & vbTab & """name"": ""Google""" & vbCrLf
    json = json & "}"
 
    ActiveSheet.Shapes(1).TextFrame2.TextRange.Text = json
  
  
End Sub

Form を使うのは面倒ですし、今時 Form でも無いだろうし、セルとこの方法でたいていの入力はまかなえると思います。

Shape オブジェクト (Excel)





タグ:VB VBA EXCEL
posted by lightbox at 2017-07-25 02:08 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月24日


VBA : InternetExplorer.Application 経由で JSON.parse を使用する方法

InternetExplorer.Application は終了処理が面倒で、Visible を True にすると解りますが、処理がエラーで途中で終わってしまうとメモリ上に残ってしまって後の InternetExplorer.Application の処理に悪い影響が出ます。なので、毎回作成して解放するという処理方法で利用します。

InternetExplorer.Application から直接は JSON オブジェクトにアクセスできなかったので、以下のような形でアクセスしています。( Window オブジェクトは、Document.parentWindow で取得できます )

Json オブジェクトのプロパティに予約語(たとえばこの場合、text というプロパティ)を使用したら、VB のエディタが .Text と強制変換して実行時にエラーとなりました。なので、textdata というプロパティに変更してテストしました。

Sub ボタン1_Click()

    Dim doc As Object, result As Object

    Set Ie = CreateObject("InternetExplorer.Application")
    'Ie.Visible = True
    Ie.Navigate ("about:blank")
    
    Do While Ie.Busy
        ' 100 ミリ秒
        Wscript.Sleep 100
    Loop
    
    Set doc = Ie.document
    
    doc.write "<script>document.JSON_Parse=function(s) {return JSON.parse(s);}</script>"
    
    Dim str As String
    
    str = Cells(1, 1).Value
    
    Set result = doc.JSON_Parse(str)
    
    MsgBox (str)
    
    MsgBox (result.option.textdata)
    
    Ie.Quit
    
    Set Ie = Nothing

End Sub






タグ:VBA VB EXCEL
posted by lightbox at 2017-07-24 17:56 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月23日


VBA : FileSystemObject でテキストファイル(CSV) を読み込んでセルにセットする

この記事は、『VBA : 一ヶ月の予定リストの作成』の続きです。
テンプレートシートをコピーして作業シートを作成する関数 "対象" という名前のシートがあればそれを使い、無ければ "テンプレート" シートをコピーして、"対象" と言う名前に変更します。
Function LoadSheet()
    
    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' "対象" Sheet の取得
    ' ********************
    On Error Resume Next
    Set sheet = Worksheets("対象")
    On Error GoTo 0
    
    ' "対象" Sheet が無い場合は テンプレート をコピーして作成
    If sheet Is Nothing Then
        Call Worksheets("テンプレート").Copy(, Worksheets("年月入力"))
        ' コピーした Sheet の名前を変更
        Application.ActiveSheet.Name = "対象"
        ' 変数にコピーした Sheet をセット
        Set sheet = Application.ActiveSheet
    End If
    
    Set LoadSheet = sheet

End Function


※ 戻り値は、Worksheet オブジェクトです。

FileSystemObject は、ThisWorkbook に定義

Workbook_Open イベントで一度だけ実行して作成し、ブックを閉じるまでずっとそれを使います。

Public Fs As Object

Private Sub Workbook_Open()

    Set Fs = CreateObject("Scripting.FileSystemObject")

End Sub


※ Open から Line Input を使わないのは、FileSystemObject ならば 他の VB 系でも使用可能で汎用性が高いからです。

処理

※ Fs は、ThisWorkbook に定義されているので、ThisWorkbook.Fs と参照します
Sub ボタン2_Click()

    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' 戻り値を取得
    ' ********************
    Set sheet = LoadSheet

    ' ********************
    ' ファイルを開く
    ' ********************
    Dim Path As String
    Path = Application.GetOpenFilename("CSV,*.csv,全て,*.*", , "CSVファイルを選択して下さい")
    If Path = "False" Then
        Exit Sub
    End If
    
    ' ********************
    ' オープン
    ' ********************
    On Error Resume Next
    Set InObj = ThisWorkbook.Fs.OpenTextFile(Path, 1)
    If Err.Number <> 0 Then
        MsgBox (Err.Description)
        Exit Sub
    End If
    On Error GoTo 0
    
    Dim Buffer As String
    Dim row As Integer: row = 0
    Dim Data() As String
    ' ********************
    ' CSV ファイルより
    ' データを読み込み
    ' ********************
    Do While Not InObj.AtEndOfStream
        Buffer = InObj.ReadLine
        
        row = row + 1
        
        Data = Split(Buffer, ",")
        
        sheet.Cells(row, 3).Value = Data(0)
        sheet.Cells(row, 4).Value = Data(1)
    Loop

    ' ********************
    ' ファイルクローズ
    ' ********************
    InObj.Close

End Sub


Application.GetOpenFilename の第二引数(FilterIndex)は省略しています。その代わり、第三引数を指定しています( タイトル文字列の指定 )

Split 関数
OpenTextFile メソッド
ReadLine メソッド






タグ:EXCEL VB VBA
posted by lightbox at 2017-07-23 20:57 | VBA | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり