テキストファイルの処理 メモ帳、CSV形式も

Excelは、メモ帳などが扱うテキストファイルも使える。

Workbooks.Openメソッドでテキストファイルを呼び込む。このメソッドはテキストファイルを呼び込めばマクロ記録でコードを得ることができる。上書き保存はSaveメソッドがある。ファイル名を指定する場合は、SaveAsメソッドがある。

ドキュメントフォルダにa.txtをメモ帳で作成してからExcelでこれを読み込む。メモ帳の中身はTABキーを入れるとExcelのシートでは、別の列に入る。改行で次の行に入る。

イミディエイトウィンドウ

?vba.CurDir     'カレントフォルダを調べる
C:\Users\take\Documents  'VBAのカレントフォルダの初期値はドキュメントフォルダ takeはユーザー名
excel.Workbooks.Open "a.txt"      'a.txtファイルのデータがA列に入る
excel.Workbooks(1).Save   ‘上書き。1かどうかは「?excel.Workbooks(1).Name」で要確認
excel.Workbooks(1).SaveAs "b.txt"  '別の名前で保存する
‘フルパスで呼び込む場合
?vba.CurDir & "\a.txt"           'a.txtファイルをC:\からの文字列になるか確認
C:\Users\take\Documents\a.txt
excel.Workbooks.Open curdir & "\a.txt"      '\を付ける
練習:CSV形式で表を保存してからExcelで表示する

CSV形式とは、以下の特徴がある。
1,テキストファイルなのでメモ帳でも読み込み、保存できる。
2,コンマ区切りで列を、改行コードを1行とする表形式のデータ
ExcelでもCSV形式を呼び込み、保存できる。

以下はイミディエイトウィンドウ

excel.Workbooks.Open "a.csv"

3行目のB、C列は2,000のつもりでも””で囲まないと別のセルになる。

Excel側のC3に「2,000」と入れる。

?excel.Application.Workbooks(1).Name  'ファイル名を確認
a.csv
excel.Application.Workbooks(1).save  '上書き保存

メモ帳でa.csvを開く(ショートカットメニューの編集かメモ帳を開いておいてa.csvファイルをドラッグ)とには”2,000”になる。

練習:Excelの表をCSV形式で保存する。

Sheet1の表形式のデータをcsv形式で保存する。SaveASメソッドを使う。マクロ記録では以下のようになっている。以下はイミディエイトウィンドウ。「:=」は名前付き引数で順番に引数を入れてもいいが、引数名があると読みやすい。

    ActiveWorkbook.SaveAs Filename:="C:\Users\take\Documents\名簿.csv", FileFormat _
        :=Excel.xlCSV, CreateBackup:=False

名前付き引数にせず第一引数のファイル名はCurDirを使って保存するファイル名を指定した。丁寧にSaveAsで名前を指定して保存する。

Sheet1.SaveAs vba.CurDir & "\名簿.csv"

メモ帳で表示する。イミディエイトウィンドウでメモ帳を起動する。

shell "notepad 名簿.csv",vbNormalFocus

以下は、体験のために使うデータ。

a.txtのデータ
1234	333
abcde	ddd	

a.csvのデータ
12,3,4
aa,kk,ff
"1,000",2,000

カテゴリー: 13 ファイル処理、メモ帳とのデータ処理 | コメントする

ExcelからWordを操作する

まず、WordのVBEからWordを操作してから、ExcelのVBEからWordを操作する。同じことだけとすごいことしてます。

Wordのオブジェクのモデル

Word上でマクロ記録し、そのコードをExcelで実行するとWordをExcelで操作することになる。

マクロ記録でメソッドやプロパティがわかってもオブジェクト全体のモデルを知っていないとコードを修正、追加できない。

Wordのオブジェクトモデル

Paragraphs:パラグラフ、段落。改行コードが区切り文字。
Sentences:センテンス、文。「。」が区切り文字。
Words:ワード、単語
Characters:キャラクタ、文字。1文字。

Wordオブジェクトモデルを参考に操作する

次図のような短い文書を作って確認する。イミディエイトウィンドウで、Countプロパティで個数を確認してから、Characters以外の各オブジェクトの中身を出力した。

Wordのイミディエイトウィンドウでオブジェクトの中身を確認

以下に上の図で使う材料を置きます。

Wordに入れる文書。

1つ目の段落です。
2つ目の段落です。改行が段落の区切り文字になります。

Excel側のVBEのイミディエイトウィンドウで実行するコード

?word.Application.Documents.Count 
?word.Application.Documents(1).Name
?word.Application.Documents(1).Paragraphs.Count
?word.Application.Documents(1).Paragraphs(1).Range
?word.Application.Documents(1).Paragraphs(2).Range
?word.Application.Documents(1).Paragraphs(3).Range
?word.Application.Documents(1).Paragraphs(2).Range.Sentences.Count
?word.Application.Documents(1).Paragraphs(2).Range.Sentences(1)
?word.Application.Documents(1).Sentences(1) 
?word.Application.Documents(1).Sentences(2)
?word.Application.Documents(1).Sentences(3)  

ExcelからWordを操作する

アプリ間のやり取りは、共有できるファイルやネットワークを使う方法が考えられる。しかし、ExcelやWord、SolidWorks(CADソフト)などVBEの「メニュー/ツール/参照設定」で見えるよにWindowsの仕様として組み込まれた仕組みによって他のアプリを起動し、起動したアプリを操作できるインターフェースが公開されている。そのため、比較的簡単に他のアプリの機能を利用することができる。カット&ペースとかOLEとかできるようにアプリ間のデータの受け渡しは以前からできるが、これをプログラムでやったようなもの。

やることは、ExcelのVBEでWordのライブラリを参照設定すれば、WordでVBEの操作と同様にできる。

スマホの方は、ここをクリックするYouTubeで見れます。

カテゴリー: 8 ExcelとVBEの関係、Wordとのデータ処理 Excelオブジェクト | コメントする

マクロ記録の状態をリアルタイムで見る

マクロの記録を見ながらExcelのオブジェクトを操作する。記録中に削除もできるで!。コメントも追加できる。

マクロ記録を見ながらできることを紹介

これができるとExcelオブジェクトのメソッドやプロパティを調べやすくなる。と思うのだが。

でもマクロ記録のコードの特徴があるからこれに慣れんとね。これはまたいずれ。

カテゴリー: 4 マクロ記録でオブジェクトを調査する | コメントする

LetとSetステートメント

次図のように値型とオブジェクト型の2つに分けるとができる。

値型とオブジェクト型

最も適用範囲が広いのがバリアント/Variant型。Variant型は動的に変数のメモリ領域を割り当てる。しかも、Variant型はどんな型にも対応できるのでメモリは大きめに用意されている。最近流行りのRubyやPythonなどのント/Variant型。Variant型は動的に変数のメモリ領域を割り当てる。しかも、Variant型はどんな型にも対応できるのでメモリは大きめに用意されている。最近流行りのRubyやPythonなどのスクリプト言語は変数宣言しないVariant型みたいなもんです。

Letステートメントは、頻繁に現れるステートメントなのだが普通は省略する。

  x = 1 + 2

=は代入演算子で、次が正確な構文になる。

  Let x = 1 + 2

Letステートメントを使う変数とSetステートメントを使う変数という分類になる。

Letは日本語では「入れる」という意味。例ではxには数値3が入る。値型の変数はLetを使う。これに対してSetでは値を扱うのではなく右辺(=の右側)のメモリ上のアドレスを入れる。Object型の変数には、オブジェクトのインスタンス(Instance、実体)がロードしている先頭アドレスが入る。Setは「オブジェクトへの参照」と言う。

  • オブジェクト変数には、オブジェクトを指すアドレスが入っていると解釈する。
  • オブジェクト変数には、参照先のアドレスが入っている。

オブジェクト変数は、操作するためのハンドルのようなもの。

以下を標準モジュールかSheet1などに書いて実行します。shがオブジェクト変数です。sh変数は、WorkSheetクラスとして振る舞う。インスタンス/実体は作らないが、実体Shee1とSheet2をSetしてSheet1とSheet2の機能(Rangeプロパティ)を使ってデータを入れる。

Sub aa()
    Dim sh As Worksheet
    Set sh = Sheet1
    sh.Range("a1") = 123
    Set sh = Sheet2
    sh.Range("a1") = 456
End Sub
カテゴリー: 7 変数とインスタンス作成   VBA | 2件のコメント

古くからある変数の型は値型。インスタンスを参照する参照型

インスタンスの訳は「実体」

  • Long実体は、変数と言う。
  • Worksheetクラス実体は、インスタンス(オブジェクト変数は変数例えばSheet1)と言う。
  • Dim lng As Longと宣言するとlngは変数でこの型はLong
  • Sheet1はオブジェクト変数でこのクラス(型)はWorkbook。Sheet1変数は初めからある。

古くからある型は、メモリに値を入れる箱を用意する単純な型で、VBのByte、Integer、Long、Double、Single型などの決まったサイズを持つ。サイズが変化することは無い。数値の型で覚えることは、整数か浮動小数点数と大きさだけだ。これらの型はメモリに値を保持する箱が用意され、この箱が比較的小さい。

古くからある値型とその後に考えられたオブジェクトという型。

値型は、Boolean,Integer,Long、Doubleなどの基本データ型の中に本来はオブジェクトじゃない?という型があった。VariantとStringは、オブジェクト型に近いが、VisualBasicでも値型のように使えた。他にも構造体(ユーザー定義型)、列挙型もある。

参照型は、オブジェクトを扱う型で、参照先のアドレス(オブジェクトがあるメモリのアドレス)を入れるので数値を入れる値型と一見同じ。値型の場合は、変数宣言と同時にメモリ上のアドレスと変数を関連づけて、変数の型のサイズで領域を作る。参照型も宣言時点では、メモリ上のアドレスと変数を関連づけて、アドレスを入れる領域を作る。しかし、その変数には何も入っていない/参照していない。Newキーワードかオブジェクトのメソッドを使ってメモリ上にインスタンス/実体を作った時点で、そのメモリ上のアドレスを参照型の変数に入れる。

https://youtu.be/hP7NB6Av9y0
カテゴリー: 7 変数とインスタンス作成   VBA | 2件のコメント