なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

VBA初級からSQLを学ぶ~仮まとめ~

f:id:nazuna_0124:20190909213347p:plain

久しぶりの更新。でも気にしない。

おつかれさまです。なずなです。


今回は仮まとめバージョン。

気が向いたらそのうちまとめます。


達成目標

・「VBASQLができる方」の求人に応募できるようにする

・面接で下記のように回答できるようにする


面接官<「SQLはどのくらいできますか?」


なずな<「目安として基本情報処理レベルの問題はすぐわかります。普通に参照、更新、削除なら問題ありません」


前提学習レベル

VBAの2重ループ、連想配列は理解していること

・Vlookupが使える

連想配列でキーからデータを取り出せる。


ひとまずこのくらいで。CreateObjectを初めて見るってレベルだとつらいです。


おおよその学習順番

・Vlookupの復習

Accessを使ってみる

GUIベースでSelectを見てみる

・正規化されたテーブルを確認する

VBASQLを発行してみる

・Webシステムに対するDBの概要確認

sqliteを使ってみる

・A5でDBに接続してみる


このくらい触ったことあればきっとだいじょうぶ!



いつ作れるかなぁ。気が向いたら!

Djangoの学習計画(仮)

f:id:nazuna_0124:20190831215918p:plain

画像作るのがめんどくさくて更新自体を辞めてしまっていた!


ちょっと本末転倒。

おつかれさまです。なずなです。



めずらしく、少しは計画建ててから勉強してみようというやつです。



習得背景

Accessで可能な程度に高速でWebシステムを作れるようにしたい。


目標

・なんらかのWebシステムを3~5つ

・後半2つは速度重視


学習教材

・Qiitaと適当にぐぐった記事

Amazon読み放題で無料のなにか


何を使ったかは後で公開します。

時間をかけてもいいから、お金をかけない方向です。


流れ

  1. 環境構築、Webページ表示

  2. DB作成、マイグレーション

  3. 管理画面からデータ登録

  4. フォーム作成

  5. Get、Postの把握

  6. 各種部品の作り方

  7. 更新、削除の作成

  8. Boostrapの適用

  9. 体裁を整える


期限

12月半ばまで


補足

・アップロード、公開まではしない予定

・時間があまるようならAzureにでもつかって。

AccessからのExcel操作~VBA 入門 Access ~

f:id:nazuna_0124:20190929180554p:plain

Excelを開く枚数が多くてイライラしている皆様こんにちは。

なずなです。


今回はVBAのためだけにAccessを利用するお話です。



完成品

動作風景

f:id:nazuna_0124:20190929180728g:plain


コード


Option Compare Database
Option Explicit




Sub シェイプ全削除()
    Dim sh As Worksheet
    
    Set sh = TageSH("応募書類工程表*")

    Dim shp As Shape
    
    For Each shp In sh.Shapes
        shp.Delete
    Next
    

End Sub


'該当シートを返す
Function TageSH(ByVal bkName As String)
    Dim xls As Excel.Application
    Dim bk As Workbook
    
'Excelを開いていないとエラーのため暫定回避
On Error Resume Next
    Set xls = GetObject(, "Excel.Application")
    Set bk = Nothing
    


    Dim b As Workbook
    
    '引数のブック名を含むブックを検索
    For Each b In xls.Workbooks
        If b.Name Like bkName Then
            Set bk = b
            Exit For
        End If
    Next
    
    Dim sh As Worksheet
    
    If bk Is Nothing Then
        Set sh = Nothing
    Else
        Set sh = bk.Worksheets("工程表")
    End If
    
    
    
    Set TageSH = sh

End Function

'全てのシェイプが削除されるので注意
Sub シェイプの全削除()
    Dim shp As Shape
    Dim sh As Worksheet
    
    Set sh = TageSH("応募書類工程表*")
    
    
    For Each shp In sh.Shapes
        shp.Delete
    Next
    
End Sub

Sub 予定の開始と終了日付の幅でシェイプを配置する()
    Dim sh As Worksheet
    
    Set sh = TageSH("応募書類工程表*")
    
    If sh Is Nothing Then
        MsgBox "応募書類工程表ブックを開いてからボタン押してね"
        Exit Sub
    End If
    
    'A1セルに作成
    '予定シェイプの作成 sh, 1, 1, 50
    
    Dim col As Long
    Dim endCol As Long
    Dim i As Long
    Dim statday
    Dim endday
    
    For i = 5 To 15
        '対象行の開始行を取得
        statday = sh.Cells(i, 8).Value
        endday = sh.Cells(i, 9).Value
        
        Dim x As Long
        
        x = 13
        Do While sh.Cells(3, x).Value <> ""
        
            '試しに表示はしてみましょう
            'Debug.Print sh.Cells(3, x).Value
        
            '日付が一致したら列を代入
            If statday = sh.Cells(3, x) Then
                col = sh.Cells(3, x).Column
            End If
            
            '同日がありえるのでelseifは使わない
            If endday = sh.Cells(3, x) Then
                endCol = sh.Cells(3, x).Column
            End If
        
            x = x + 1
        Loop
        
        '不要になったので削除
        'col = 13 + i - 5
    
        '日付の差計算。0になるので1日足しておく
        '年末年始をまたぐときは年の変え忘れに注意
        Dim 日付差
        日付差 = DateDiff("d", statday, endday) + 1
        
        '
        Debug.Print 日付差
        
        '日付の幅は固定だとしてM列(13)を利用
        予定シェイプの作成 sh, i, col, sh.Cells(i, 13).Width * 日付差
    Next
    
    
End Sub

Sub 予定シェイプの作成(ByVal sh As Worksheet, ByVal top, ByVal left, ByVal w)
    Dim shp As Shape
    
    Set shp = sh.Shapes.AddShape(1, sh.Cells(top, left).left, sh.Cells(top, left).top, 15, 15)
    
    '高さ
     shp.Height = 10
     
    '幅
     shp.Width = w
    
End Sub


Accessを使いたくなる理由

1. Excelを開く枚数が多い

Excelで管理をしていたりすると5枚くらい開くことが多いです。

管理用、参照用、これから編集する用、作業手順、報告用みたいに。


ここからさらにVBAのツール用と開きたいないので、あえてAccessにのせます。


2. 共有ブックが使いにくい

データの重複、同時更新がしにくい場合や、ブックが壊れてしまったときに

検討されることが多いです。

わたしもいろいろ試しましたが、Accessも同じ問題を抱えてます。

この理由で使うのは非推奨。


3. SQLを気軽に使いたい

慣れているとExcelのピポッドより使いやすかったりします。

これから勉強したいという方にはおすすめです。


みどころ

1. GetObjectの使い方

OutlookやWordを使う場合でも似たケースになります。

Office製品同士の連携はVBAの特徴の一つなので覚えておきましょう。


2. ブックの検索

VBAにはブックの存在確認の関数はメソッドはありません。

自作になります。ExcelVBAとしてもよく使用します。


このときLike演算子を使っておくとブック名が月単位で変わる場合などにも

対応できます。



とゆーわけで以上です。

何か質問ありましたらお気軽にどうぞです。

AccessからExcelのセルに書き込む~Access VBA 入門~

f:id:nazuna_0124:20190920212833p:plain

今回はデータベースを使わないAccess VBAです。

フォームが使いやすく思わぬところで利点があるのです。


おつかれさまです。なずなです。



Accessというよりデータベースって結構難しいんです。

フォームだけでも最初に使ってみましょう。



今回の完成品

f:id:nazuna_0124:20190923194201p:plain


Sub 対象ブックのA1に書き込む()
    ' Windows Excel xx.0 Object Libraryの参照設定をしてください。
    Dim xls As Excel.Application
    
    'Excelを開いていないとエラーになります。
    Set xls = GetObject(, "Excel.Application")
    
    Dim bk As Workbook
    
    '対象のブックしか開いていない前提
    Set bk = xls.Workbooks(1)
    
    bk.Worksheets(1).Range("A1").Value = "Accessから入力"

End Sub


注目のポイント

GetObjectというやつ

すでに開いているオブジェクトをクラス名を指定して

取得する命令です。


よくわたしはこれとCreateObjectをあわせて

オブジェクトをつかむって表現してます。


オブジェクトを変数で捉えることで初めて操作ができるのです。


このときのクラス名は覚えるだけです。がんばりましょう。



Access準備の手順

今回は普通に手順をのせてみます。

バージョンが違うと少し違うかも。知ってる人は飛ばしてね。


Accessのファイルを作成して開きます。

f:id:nazuna_0124:20190923194720p:plain


初期画面から作成をクリック f:id:nazuna_0124:20190923194757p:plain


空白のフォームをクリック

f:id:nazuna_0124:20190923194824p:plain


開いたフォームで右クリック。デザインビューをクリック f:id:nazuna_0124:20190923194859p:plain


デザインタブのボタンをクリック f:id:nazuna_0124:20190923194925p:plain


ドラッグでボタンを設置。ウィンドウが表示されるのでキャンセル f:id:nazuna_0124:20190923194957p:plain


ボタンを右クリック。イベントのビルドをクリック f:id:nazuna_0124:20190923195107p:plain


コードビルダーを選択してOKをクリック

f:id:nazuna_0124:20190923195153p:plain


VBEがひらきます。あとで作成するプロシージャ名「サンプル」を呼び出すように入力します。 f:id:nazuna_0124:20190923195214p:plain


挿入>標準モジュールで作成します。 f:id:nazuna_0124:20190923195340p:plain


フォームウィンドウに戻って「Ctrl + S」で保存。フォーム名は任意でOKを押します。

f:id:nazuna_0124:20190923195244p:plain


フォームウィンドウに戻って「Ctrl + S」で保存。フォーム名は任意でOKを押します。 f:id:nazuna_0124:20190923195456p:plain


タブのところで右クリック。フォームビューをクリック。

f:id:nazuna_0124:20190923195531p:plain


ボタンを押すとプロシージャが実行。メッセージボックスが表示されます。

f:id:nazuna_0124:20190923195604p:plain


プロシージャを作成。

Sub 対象ブックのA1に書き込む()
    ' Windows Excel xx.0 Object Libraryの参照設定をしてください。
    Dim xls As Excel.Application
    
    'Excelを開いていないとエラーになります。
    Set xls = GetObject(, "Excel.Application")
    
    Dim bk As Workbook
    
    '対象のブックしか開いていない前提
    Set bk = xls.Workbooks(1)
    
    bk.Worksheets(1).Range("A1").Value = "Accessから入力"
End Sub


Set bk = xls.Workbooks(1)

こいつに慣れてほしいです。

オブジェクトとしてブックをつかんでしまえば、あとは

普段のVBAと一緒です。



作ったプロシージャを呼びだすように変更。

Private Sub コマンド0_Click()
    Call 対象ブックのA1に書き込む
End Sub

VBEの左上。フォームのところをクリックで画面を開きます。

そこを修正。

Private Sub コマンド0_Click()
    Call 対象ブックのA1に書き込む
End Sub


これでボタンを押したらExcel側へ書き込むようになります。


思ったより長かったので今回はここまで。

乗せ換えるのは次回に回しまーす。

VBAでAccessから工程表のシェイプを操作する~その2~

f:id:nazuna_0124:20190922213836p:plain

少しだけアイキャッチ画像をがんばってみるというテストです。

センスは気長に磨いていくしかないのでしょうね。


おつかれさまです。なずなです。


今回の処理の中に初心者のときだとハマりどころがあります。

さらっと同じことを思いつかない方はぜひ練習してみてね。


このくらいでも2,3時間かかるのはザラです。

気長にいきましょう。


今回も工程表のシェイプですよ~。

今回の完成品

f:id:nazuna_0124:20190922214253p:plain


追加した部分

・図形が日付と連動して列が決定するようになりました。

・幅は予定開始~終了まで設定されるようになりました。


コードはこちらです。ぺたっとコピペで動くはず。

Excel部分はがんばってください←


'全てのシェイプが削除されるので注意
Sub シェイプの全削除()
    Dim shp As Shape
    Dim sh As Worksheet
    
    Set sh = TageSH()
    
    
    For Each shp In sh.Shapes
        shp.Delete
    Next
    
End Sub

Sub 予定の開始と終了日付の幅でシェイプを配置する()
    Dim sh As Worksheet
    
    Set sh = TageSH
    
    'A1セルに作成
    予定シェイプの作成 sh, 1, 1, 50
    
    Dim col As Long
    Dim endCol As Long
    Dim i As Long
    Dim statday
    Dim endday
    
    For i = 5 To 15
        '対象行の開始行を取得
        statday = sh.Cells(i, 8).Value
        endday = sh.Cells(i, 9).Value
        
        Dim x As Long
        
        x = 13
        Do While sh.Cells(3, x).Value <> ""
        
            '試しに表示はしてみましょう
            'Debug.Print sh.Cells(3, x).Value
        
            '日付が一致したら列を代入
            If statday = sh.Cells(3, x) Then
                col = sh.Cells(3, x).Column
            End If
            
            '同日がありえるのでelseifは使わない
            If endday = sh.Cells(3, x) Then
                endCol = sh.Cells(3, x).Column
            End If
        
            x = x + 1
        Loop
        
        '不要になったので削除
        'col = 13 + i - 5
    
        '日付の差計算。0になるので1日足しておく
        '年末年始をまたぐときは年の変え忘れに注意
        Dim 日付差
        日付差 = DateDiff("d", statday, endday) + 1
        
        '
        Debug.Print 日付差
        
        '日付の幅は固定だとしてM列(13)を利用
        予定シェイプの作成 sh, i, col, sh.Cells(i, 13).Width * 日付差
    Next
    
    
End Sub

Sub 予定シェイプの作成(ByVal sh As Worksheet, ByVal top, ByVal left, ByVal w)
  
    
    Set shp = sh.Shapes.AddShape(msoShapeRectangle, 1, 1, 15, 15)
    
    '高さ
     shp.Height = 10
     
    '幅
     shp.Width = w
    
    '位置
     shp.top = Cells(top, left).top
     '相対移動
     shp.IncrementTop 5
     shp.left = Cells(top, left).left

End Sub

'該当シートを返す
Function TageSH()
    Dim bk As Workbook
    
    Set bk = ThisWorkbook
    
    Dim sh As Worksheet
    
    Set sh = bk.Worksheets("工程表")
    
    Set TageSH = sh

End Function


それでは以下は作成順番です。

ちょっとずつ作っていくのがコツですよ~。


シェイプを全削除する処理を作る

最初から直接は関係がない処理ですが大事です

前回のを何度か試した人はわかるはず。

作成の処理を何回もするとどんどん重なっていくのです。


ひとまず手作業はしんどいので、削除をさらっと作ります。


'全てのシェイプが削除されるので注意
Sub シェイプの全削除()
    Dim shp As Shape
    Dim sh As Worksheet
    
    Set sh = TageSH()
    
    For Each shp In sh.Shapes
        shp.Delete
    Next
    
End Sub

'該当シートを返す
Function TageSH()
    Dim bk As Workbook
    
    Set bk = ThisWorkbook
    
    Dim sh As Worksheet
    
    Set sh = bk.Worksheets("工程表")
    
    Set TageSH = sh

End Function


あとあとの変更に向けてブックとシートを返す関数にしてます。

以降は省略するので注意してください。


複数オブジェクトをFor Eachループで1個ずつ取り出して、

英語から想像できるdeleteメソッドで消去です。


1点注意点として、これは全削除です。


人の作ったExcelだと罫線が図で作られていたり、

思わぬところで使われているものです。


あくまでデバッグ用にしましょう。



予定シェイプの列を日付にあわせる

まずは開始日からスタートするように作り直します。

Sub ループで動的な位置にシェイプを配置する()
    Dim sh As Worksheet
    
    Set sh = TageSH
    
    'A1セルに作成
    予定シェイプの作成 sh, 1, 1, 50
    
    Dim col As Long
    Dim i As Long
    Dim tageday
    
    For i = 5 To 15
        '対象行の開始行を取得
        tageday = sh.Cells(i, 8).Value
        
        Dim x As Long
        
        x = 13
        Do While sh.Cells(3, x).Value <> ""
        
            '試しに表示はしてみましょう
            'Debug.Print sh.Cells(3, x).Value
        
            '日付が一致したら列を代入
            If tageday = sh.Cells(3, x) Then
                col = sh.Cells(3, x).Column
            End If
        
            x = x + 1
        Loop
        
        '不要になったので削除
        'col = 13 + i - 5
    
        '
        予定シェイプの作成 sh, i, col, 50
    Next
End Sub


わたしが初心者さんには九九の二重ループを確認する理由のひとつです。


行のループがスタートしてから特定列の日付を変数に格納。

日付列のループを初めて一致したらそこがシェイプの置きたい位置です。



開始完了日付までの幅に変更する

幅は固定されてしまっていたので、終了日までに変更します。

さっきは開始日だけ取得しましたがよく考えたら終了日も必要です。


細かい設計してから作らないときはこういうのはあるあるです。

気にせず修正しましょう。


Sub 予定の開始と終了日付の幅でシェイプを配置する()
    Dim sh As Worksheet
    
    Set sh = TageSH
    
    'A1セルに作成
    予定シェイプの作成 sh, 1, 1, 50
    
    Dim col As Long
    Dim endCol As Long
    Dim i As Long
    Dim statday
    Dim endday
    
    For i = 5 To 15
        '対象行の開始行を取得
        statday = sh.Cells(i, 8).Value
        endday = sh.Cells(i, 9).Value
        
        Dim x As Long
        
        x = 13
        Do While sh.Cells(3, x).Value <> ""
        
            '試しに表示はしてみましょう
            'Debug.Print sh.Cells(3, x).Value
        
            '日付が一致したら列を代入
            If statday = sh.Cells(3, x) Then
                col = sh.Cells(3, x).Column
            End If
            
            '同日がありえるのでelseifは使わない
            If endday = sh.Cells(3, x) Then
                endCol = sh.Cells(3, x).Column
            End If
        
            x = x + 1
        Loop
        
        '不要になったので削除
        'col = 13 + i - 5
    
        '日付の差計算。0になるので1日足しておく
        '年末年始をまたぐときは年の変え忘れに注意
        Dim 日付差
        日付差 = DateDiff("d", statday, endday) + 1
        
        '
        Debug.Print 日付差
        
        '日付の幅は固定だとしてM列(13)を利用
        予定シェイプの作成 sh, i, col, sh.Cells(i, 13).Width * 日付差
    Next
End Sub


完成品でも使われているのはこちらです。


ポイントは3つ

  1. statday と endday の変数を作ってそれぞれ取得

  2. 日付差を取得するdatediffを利用

  3. 開始日終了日が同じはありえるので、1足しておく


3とは案外わすれがちです。


2は覚えるのみ!!

日付操作ということでぐぐりましょう。



バグチェック

ここらで日付をいろいろ変更したりしてみて

いろいろ試してみましょう。


日付が空白だったらどうなるんだろとか思った人はするどい!


今の段階では気にしなくていいです。



だんだんブログで見るにはしんどくなっている気がしますが、

次回はAccessに乗せ換えてみます。

またみてね~。

VBAでAccessから工程表のシェイプを操作する~その1~

f:id:nazuna_0124:20190922094103p:plain

キャラクターの縁を白くしてみるテストでっす。

おつかれさまです。なずなです。


こんなかんじで質問を頂きました。

f:id:nazuna_0124:20190922094259p:plain


これと組み合わせて最終的な操作を

Accessで動くものを作ってみたいと思います。

全3回くらいじゃないでしょうか。


今回はずらっとシェイプを並べるところまでです。



今日の完成品

f:id:nazuna_0124:20190922094521p:plain


Sub 位置と幅を指定してシェイプを挿入する()
    Dim sh As Worksheet
    
    Set sh = TageSH
    
    'A1セルに作成
    予定シェイプの作成 sh, 1, 1, 50
    
    'L列全てに挿入するテスト
    
    Dim i As Long
    
    For i = 5 To 15
        予定シェイプの作成 sh, i, 13, 50
    Next
    
    
End Sub

Sub 予定シェイプの作成(ByVal sh As Worksheet, ByVal top, ByVal left, ByVal w)
  
    
    Set shp = sh.Shapes.AddShape(msoShapeRectangle, 1, 1, 15, 15)
    
    '高さ
     shp.Height = 10
     
    '幅
     shp.Width = w
    
    '位置
     shp.top = Cells(top, left).top
     '相対移動
     shp.IncrementTop 5
     shp.left = Cells(top, left).left

End Sub

'該当シートを返す
Function TageSH()
    Dim bk As Workbook
    
    Set bk = ThisWorkbook
    
    Dim sh As Worksheet
    
    Set sh = bk.Worksheets("工程表")
    
    Set TageSH = sh

End Function


以降は作業順番でつらつらっと書いていきます。


内容をざっくり決める

ツイッターのお話だけなので読み取りにくい部分もあります。


・作るのは工程表

・進捗バーと予定バーがあって色がわかれている

・最終的に消したいのは予定バー

・(書いてないけど)対象ブックにはマクロ置いちゃだめなことにする

・操作はAccessからやってみる。


Excel側のサンプルを作る

実際の仕事だとすでに使っているブックがあると思います。

シートをコピーしちゃって、それは「.xlsm」ファイルで作っちゃいましょう。

f:id:nazuna_0124:20190922095030p:plain


それがこんなものだとします。


シェイプを挿入してみる

ちょーど機能やりました。図形はShapesです。

最初に適当な□図形を挿入します。


そのあと「ぐぐったり」「プロパティを調べたり」して、

このコードを作りました。


'テスト用
Function 予定シェイプを確認してみる()
    Dim shp As Shape
    
    Set shp = ThisWorkbook.Worksheets(1).Shapes(1)
    
    '色
     shp.BackgroundStyle = msoBackgroundStylePreset1
     shp.ShapeStyle = msoShapeStylePreset9
     
    '高さ
     shp.Height = 10
     
    '幅
     shp.Width = 100
    
    '位置
     shp.top = Cells(1, 1).top
     '相対移動
     shp.IncrementTop 5
     shp.left = Cells(1, 1).left
     
End Function

適当な位置に作った図形の位置を変更、高さと幅を変更です。


相対位置を変えるメソッドがあるので、これで真ん中に寄せています。



操作対象のシートを返すFunctionを作る

最終的に操作するブックにはVBAが置けません。

つまり省略できないってことです。

後で変更がしやすいようにいまのうちに作っておきます。


Function TageSH()
    Dim bk As Workbook
    
    Set bk = ThisWorkbook
    
    Dim sh As Worksheet
    
    Set sh = bk.Worksheets("工程表")
    
    Set TageSH = sh

End Function

こういうのです。


こうしておけばあとはThisWorkbookを変更するだけで、

他のプロシージャには変更不要で使えます。



引数を受け取ってシェイプを追加操作する

先に作ったものは場所もシートもプロシージャ内で決められてました。

あとで大量に作るので、引数で受け取って処理するように変更します。


Sub 予定シェイプの作成(ByVal sh As Worksheet, ByVal top, ByVal left, ByVal w)
  
    
    Set shp = sh.Shapes.AddShape(msoShapeRectangle, 1, 1, 15, 15)
    
    '高さ
     shp.Height = 10
     
    '幅
     shp.Width = w
    
    '位置
     shp.top = Cells(top, left).top
     '相対移動
     shp.IncrementTop 5
     shp.left = Cells(top, left).left

End Sub

それが完成品でも使われてるこちらです。


AddShapeってメソッドがあるんですねー(ぐぐった!)


作成段階で位置を指定できますが、そこはお好みで。


メインのプロシージャ作成

関数ができたらあとは使うものを作成して完了でっす。

Sub 位置と幅を指定してシェイプを挿入する()
    Dim sh As Worksheet
    
    Set sh = TageSH
    
    'A1セルに作成
    予定シェイプの作成 sh, 1, 1, 50
    
    'L列全てに挿入するテスト
    
    Dim i As Long
    
    For i = 5 To 15
        予定シェイプの作成 sh, i, 13, 50
    Next
    
End Sub

今回は列を固定です。

次回は列を変動させるところから!


ファイルごと欲し~なんて人がいたら

コメントかツイッターで連絡ください。


共有方法考えてみます。

VBAで図形(shape)の情報を取得する

f:id:nazuna_0124:20190920212856p:plain

元気がないのですっかり更新停滞気味。

おつかれさまです。なずなです。

今日友達に何となく聞かれたので早速試してみることに。


聞かれたのは

カテゴリごとに分かれてる図形の情報を取得できる?というもの。



回答は縦に位置が揃ってるとか配置が固定されてればいけるよ!



結果はこちら。


f:id:nazuna_0124:20190920212146p:plain



コードはこれ


Sub sample()
    Dim shp As Shape
    Dim dic As New Scripting.Dictionary
    
    dic.Add 2, "大カテゴリ"
    dic.Add 4, "中カテゴリ"
    dic.Add 6, "小カテゴリ"
    
    
    
    For Each shp In Worksheets(1).Shapes
        Debug.Print shp.Name & ":" & dic(shp.TopLeftCell.Column) & ":" & shp.TextEffect.Text
    Next
    
End Sub


出力結果です。

f:id:nazuna_0124:20190920212301p:plain


結局はオブジェクトのプロパティの暗記というかんじです。


図形はShapes


ShapeにはTopLeftCellという所属(?)しているセルの情報がある。


この辺知ってれば(ぐぐれば)あとは思いつくのではないかと。


中のテキストの取得がプロパティ的に深いので、参考にのせておきました。



工夫すれば特定の図形だけ削除したり、隠れてる図形見つけたりと

たまーに使う機会がありまーす。