職業訓練校のまいにち~ポリテク応援ブログ~

職業訓練出た後に運用オペレーターに就職。VBAで運用構築がメインのお仕事です。

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という所属(?)しているセルの情報がある。


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


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



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

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

疲れている人のためのEclipse導入でHello World~JAVA入門~

f:id:nazuna_0124:20190909213343p:plain

Javaってなんだ!?

Eclipseさんのことさー


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


さすがに復習しないで突撃すると泣くと思われるので、

ちゃちゃっとインストールしようとして軽く挫折。


ざっくり手順だけ残しておきます。


Eclipseを入れたいのに、いきなりPleiadesさんからはじまるのが

地味に納得いっていません

PleiadesのAllパッケージをダウンロード

リンクを開いて

Eclipse 日本語化 | MergeDoc Project

こーんなルートでダウンロードします。

f:id:nazuna_0124:20190909185622p:plain

f:id:nazuna_0124:20190909185703p:plain

しばし待ちます。

解凍とインストール(実行)

時間かかります。

どこかのドライブ直下にフォルダごとコピペします。


pleiades > eclipse > eclipse.exeを実行


f:id:nazuna_0124:20190909213501p:plain


思ったより時間かかるときあります。気長に待ちます


f:id:nazuna_0124:20190909213754p:plain


そのまま起動。

チェック入れなければ起動のたびに毎回たちあがります。

Hello World入力まで

プロジェクト作成

ファイル > 新規 > Javaproject

プロジェクト名は任意。

その他はデフォルトのままです。

f:id:nazuna_0124:20190909214239p:plain


ウィンドウ出たら作成をクリック


パッケージ作成

(パッケージ・エクスプローラ)プロジェクト右クリック

>新規 > パッケージ右


名前は任意です。

その他はデフォルト。

f:id:nazuna_0124:20190909214629p:plain

完了クリックしてね。

クラス作成

ほとんど同じような操作です。

パッケージを右クリック > 新規 > クラスファイル

f:id:nazuna_0124:20190909214852p:plain


名前は任意。

例の呪文用にチェックだけ入れます。

完了をクリック

f:id:nazuna_0124:20190909215124p:plain


Hello World

この画面までは作成されてるはずです。

f:id:nazuna_0124:20190909215417p:plain


いつも通りのながーーいのと一緒に入力。

「syso」と打って、Ctrl + スペースで自動補完してくれます。


ついでに実行します。


package Lesson1;

public class HelloWorld {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        System.out.println("Hello World");
    }

}


コンソール画面に表示されれば無事完了。

f:id:nazuna_0124:20190909215836p:plain


フォントと黒背景の変更

黒背景

ウィンドウ > 設定 > 一般 > 外観

f:id:nazuna_0124:20190909220521p:plain

外観そのものを選択するのが少しわかりにくいです。

フォント変更

ウィンドウ > 設定 > 一般 > 外観

色とフォント > テキストフォント

f:id:nazuna_0124:20190909220702p:plain

フォントはお好きなものをどうぞ。

わたしはMyricaさんあたりを使っています。


開きなおして完成

ひとまずこれで完成です!!

f:id:nazuna_0124:20190909220938p:plain


想像以上に覚えてませんでした。

そもそも訓練中はNetBeansさん使ってましたし。


基礎文法もメモっておかないとやばそうです。

次回にまた復習しま~す。

ブログについてアドバイスを貰ったので行動まえのまとめ

f:id:nazuna_0124:20190907225337p:plain

ツイッター経由で応募したのですよ!

読者目線でアドバイスを頂けるということで、

とっても丁寧にいただきましたっ!

こまつはるなさん、ありがと~♪

ameblo.jp


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



早速実践あるのみなのです。

まずは目次!!



目次を作ろう

わたしは目次をすっ飛ばすので気が付きませんでした。

目次から読みたいところだけ読む方も多いのだそうです。


わたしはマークダウン記法でブログ書いてます。


目次はツールバーから挿入して、あとは見出し付ければよいので

簡単ですねっ。


プロフィールを作ろう

ブログを読み進めると書いてる人のことが気になることもあるんだとか。


中の人はいろいろやっててややこしいので、要検討ですね。


押していきたいのは、非正規から正社員になってみたくて職業訓練通ったこと


現在はインフラエンジニアで開発もやったりしてますが、

VBAの経験から仕事にあまり困ってないこと


このへんですね!


カテゴリわけをしよう

これは一周回って一番難しいかもしれません。

そもそも今日の記事とかどこに分ければいいの!!!


雑記とか作っておいて、全部ここにいれちゃおうか←


イコン画像の統一は継続しよう

Vカツさん便りにオーソドックスなものを作ってみました。

思ったより目安になっているのだそーです。


デザインセンスをもうちょっと磨く方向でがんばってみましょう!


ポリテクとは?

職業訓練のことです。もちろん知らない方が多いみたいです。


ひっじょーに便利な制度ですし、どんどん使った方がいいと思ってます。


固定ページ??なんかそういうのでもう少しわかりやすくアセクスできるようにしてみます。



本日はここまでっ!

それでは、またね!!

JAVAとか忘れたので環境構築する前に思い出してみる

f:id:nazuna_0124:20190901224643p:plain

JAVAの案件に放り込まれる説が浮上してきました。

インフラエンジニアというのがそろそろ怪しくなってきています。



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


嫌いだからJAVAとかすっかり忘れてます。

ぐぐりながら手順を追って準備していくのですが、

やりたくないことなのでなかなか手が付きません。


そんな心の負担を軽くすべく、ぐぐる前の下準備メモです。


その他の環境を絡めてWindows ServerとSQL Serverでいいかな。


Eclipseのインストール

のっけからもういやです!!


なんだっけー


JDKと環境パスに気を付けてねだったと思います。


入力補完の追加とかは思い出したらやるかんじにします。


VmwareWindows Server 2016

ここはいつも通りなのでさっくりいきます。


せっかくなのでここくらい手順の記事かいてもよいかもしれません。

SQLもここでいれちゃいます。


Tomcat

JSPと含めて?? 実はここからはもうよくわかりません。


WebでHello Worldだけ目指しておきましょう。


Struts

フレームワークというやつです。1とか2とか気にせず1で。


インストールだけして使い方軽く覚えときましょう。


DBへの接続

なにはともあれここまで来ないとどうしようもないですし。


ローカルで適当にやってみましょう。


Todoリストか一言掲示

フレームワークになれるように作れるようならやってみましょう。

無理そうなら簡単な登録フォームでも。


動作テスト

バリデーションとDB登録はチェックしてみます。



以上です!!


今週1週間で少しだけ触って、土曜日までで進捗70%くらいをめざしてみまーす。

コツコツ3年くらいで正社員エンジニアを目指してみるルート

f:id:nazuna_0124:20190831215918p:plain

記事とはなんの関係もないVカツ画像をはってゆくっ

スタンプ的なものを作りたいなと思って練習中なのです。


ペイントでぽちぽち疲れました。

GIMPくらいは使ってみるべきですか?


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


わたしがなぜ職業訓練に通ったか。

普通の正社員になってみたかったから!


想定通り楽でつまらない仕事についているので、大変まんぞくです←


今日は細かいところよりざっくりルートだけまとめてみました。


たどり着けるまでの間の生活成り立つかはあまり考えていません。


なんでもいいから同じ会社で1年働く

近所のスーパーやドラッグストア、コンビニ、ファーストフード店など

長く働いたら10万以上になればそれでオッケーです。


とにかく1年働けばいいだけです。特別な結果を出さなくてオッケー。

このときに作った履歴書はちゃんと残しておきましょーね!


雇用保険は入る程度には働きましょう。

コールセンター、ヘルプデスクなどの会社に転職

PCを触る作業にいきましょう。ここは短ければ半年になります。

PCなれや、この時点でクレジットカードを作っておくのがおすすめです。


パソコンはこの時点で購入します。安いので!!


状況によってはここは飛ばしてもオッケーです。


この段階で勉強を開始したいところです。

週一程度で長めてみるか、タイピングだけはやっておきましょう。



職業訓練に通う

失業手当が訓練中はでます。

簡単に言うと直近の半年が計算基準に使われますので、

いけるならなるべく残業で稼いでおきましょう。


残業がてらVBAにさわれるならなおよし!!



SES系会社に入社

訓練通っている間に未経験可とのところにひたすら応募しましょう。


まともな上司がいそうなところ。待遇のみで選んでオッケーです。


ここは1年はいたいので、慎重に選びましょう。



次の会社に転職

無事1年経験者をゲットしたら、あとは好きに学んでもう一度転職しましょう!!


このときには、そこそこの年収になってるはずです!!



というわけで、ざっくり私と同じルートは

そんなに年数かけてもいいのでわ?

というおはなしでしたっ。