Quantcast
Channel: 午後わてんのブログ
Viewing all 420 articles
Browse latest View live

午後ツールその53、ウィンドウの整列、異なるブック(ウィンドウ)の整列

$
0
0


2016/12/31
午後ツールにボタン追加
新しいウィンドウを開いて垂直分割表示
新しいウィンドウを開いて水平分割表示
任意のウィンドウを縦横分割整列
イメージ 1
追加した4つのボタンは左から
横2分割整列
縦2分割整列
横分割整列
縦分割整列
これらは

エクセルにもとからあるウィンドウの整列とほとんど同じ
イメージ 2
表示→整列→ウィンドウの整列
これを使って

イメージ 3
こんなふうに同じブックを並べて表示したい場合の手数は
  1. 新しいウィンドウを開く
  2. 整列
  3. 上下に並べて表示
  4. 作業中のブックのウィンドウを整列にチェック
  5. OK
約5回クリックすることになる、めんどくさい
横2分割整列ボタンなら1回
縦2分割整列も1回でOK↓
イメージ 4
縦2分割整列
楽チン



異なるブックの整列

イメージ 6
こんなふうにたくさんのブックを開いていて
この中から選んだものだけ整列したいときに
エクセル2007の標準機能だと
イメージ 5
作業中のブックのウィンドウを整列するのチェックを外して
OK押せばいいようにみえるけど、これだと
開いているブックすべてが対象になってしまう
新しいエクセルならできるのかなあ
2007では無理っぽいのでVBAで解決
イメージ 7
分割整列ボタン押すと

イメージ 8
開いているウィンドウ一覧が出るので

並べたいのにチェックを入れて
イメージ 9
OK押すと

イメージ 10
選んだブックだけで整列表示される
これで異なるブックの整列ができた!

2つ以上の選択でもOK
イメージ 11
3つ選んでOK押すと
イメージ 12
3分割


並べられるウィンドウの順番
イメージ 13
このリストの上から順番に並べられる
横分割なら上から
縦分割なら左から
なのでこのリストだと気象観測記録ウィンドウは必ず一番上か1番左に表示される
このリストの順番はウィンドウを表示(アクティブに)した順番になっている
古いものが下になって一番上はアクティブウィンドウ
なのでここで一度キャンセルして
Book2:2をアクティブにしてからにすると
イメージ 14
Book2:2が一番上になる






横2分割整列のマクロ
'新しいウィンドウを開いて水平分割表示
Sub SplitWindowHorizontal()
'同じブックで複数ウィンドウじゃなければ新しいウィンドウを開く
    If ActiveWorkbook.Windows.Count = 1 Then
        ActiveWindow.NewWindow
    End If
'横分割整列
    ActiveWorkbook.Windows.Arrange xlArrangeStyleHorizontal
End Sub
これはマクロの記録できるから楽だった
縦分割はHorizontalがVerticalにかわるだけ



縦横分割整列のマクロ
'wNameはウィンドウ名の配列
'IsSplitHはTrueだと横分割、Falseで縦分割
Sub SplitWindowsSub(wName() As String, IsSplitH As Boolean)
    Dim wins As Windows
    Set wins = Application.Windows
    Dim wCount As Long
    wCount = UBound(wName)
    Dim i As Long
    Dim wh As Double, ww As Double
    wh = Application.UsableHeight    'エクセルウィンドウ内側の高さ
    ww = Application.UsableWidth     'エクセルウィンドウ内側の幅
    If IsSplitH Then
        wh = wh / (wCount + 1)
    Else
        ww = ww / (wCount + 1)
    End If
    
    Dim wLeft As Long, wTop As Long
    Dim win As Window
    For i = 0 To wCount
        Set win = wins(wName(i))
        win.WindowState = xlNormal
        With win
            .Height = wh
            .Width = ww
            .Top = 0 + wTop
            .Left = 0 + wLeft
            .Activate
        End With
        If IsSplitH Then
            wTop = wTop + win.Height
        Else
            wLeft = wLeft + win.Width
        End If
    Next
End Sub

Application.UsableHeight    'エクセルウィンドウ内側の高さ
Application.UsableWidth     'エクセルウィンドウ内側の幅
これがわかんなくて
参照したところ
ExcelVBAのSampleCode [ExcelVBA] ウィンドウを3分割表示
http://pgtv.blog135.fc2.com/blog-entry-85.html
助かりました



ダウンロード



関連記事
エクセルVBA、チェックボックス付きのListBoxのInputBox?を作ってみた ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14652565.html#14652565
ウィンドウ一覧を選ぶダイアログの表示はこれが元









去年(2016年)の夏は暑かった、暑かったああああああ

$
0
0


ベランダ菜園3年間のまとめ
イメージ 1
園芸の通販サイトなどでよく見かける図をエクセルで真似してみたけど難しい
実を収穫するものと葉っぱを収穫するものをまとめるのは無理があったなあ
バジルやにんにくは花を咲かせないように摘心するから
開花時期の意味がなかった(´∀`)
↑↓のようなグラフの作り方は
園芸サイトによくある植え付けや収穫時期を表す図表をエクセルのグラフで作ってみたメモ ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14662126.html



イメージ 2
2014年はスーパーで販売されていた大玉トマトから採取した種をまいたけど、黄化葉巻病で実らずじまい
2015年は中玉トマトのレッドオーレの種を購入、3株で200個以上の収穫で良かった
2016年も同じくレッドオーレ、種蒔き時期を1ヶ月早くした結果収穫も約1ヶ月早まってよかったんだけど、僕が暑さに耐えきれず8月30日で放置されイマイチな結果になってしまった
どれくらい暑かったのか、本当に暑かったのか?

去年の夏は暑かった
2015年と2016年の平均気温
イメージ 4
少し見にくいので線を滑らかにしてみる

イメージ 5
グラフの線を右クリック→近似曲線の追加→多項式近似→次数を6
よくわからないけど、これで線がなめらかになる
便利な機能があるなあ

滑らか曲線追加
イメージ 3
暑い

前年との平均気温の差(6月1日から11月30日)
イメージ 6
下回っている期間が少ないなあ、暑かったわけだわ
少なくとも2015年よりは暑かったのがわかる

2016年8月の0時の室温は
イメージ 7
午前0時の時点で室温30度を下回ったのは約1日
0時で室温35度とかムリでしょ

室温と湿度の計測は
イメージ 8
この時計についている温度計による手動!
温度計の信頼性だけど、室温35度以上のときに
部屋の壁やドアのノブに指先で触れると暖かく感じるから
結構正確なんじゃないかと思っている

特に暑かった8月17日前後の状況
イメージ 10
記録間隔から寝れていないのがわかる
昼間の最高気温が36度とかはいいんだけど
夜寝るときに室温が下がらないのがきつかった
日が沈むと風が止むんだよねえ、16日24時の気象庁は2.7m/sの記録だけど
窓を開けていてもカーテンが動かないのは0m/sだと思う
おかげで暖められた建物が全然冷えない感じ
室温30度、湿度50%なら寝られるけど
32度50%や30度60%だときつい
34度だと1時間位で目が覚める

湿度の影響
イメージ 9
33.1度でも湿度40なら涼しいというコメントが出る
夜は室温は多少下がるけど湿度が上がる、風が止むから
昼も夜も両方暑い
1日のうち1番室温が下がる時間は午前5時前後



8月入ったあたりから水やりと写真撮影のみで
追肥や芋虫駆除とかできなくなって
8月30日から完全放置になったのもむべなるかな
いや、ほんと去年の夏は何にもできなかったなあ



気象データは
気象庁 Japan Meteorological Agency
http://www.jma.go.jp/jma/index.html
より引用しました







園芸サイトによくある植え付けや収穫時期を表す図表をエクセルのグラフで作ってみたメモ

$
0
0


イメージ 39
こういうグラフの作り方
結構難しかったので忘れないうちにメモ
(この記事にはオチがあります)


参照したところは
Excel2010でピラミッドグラフを作成する方法 | Excelを制する者は人生を制す ~No Excel No Life~
http://excel-master.net/graph/pyramid-graph-making/



基本になるグラフ
使うグラフの種類は「積み上げ横棒」
イメージ 2
小さな範囲で試してみる
できあがるグラフは

イメージ 3
作物名と収穫とかが逆なので入れ替えるために
データソースの選択画面を開く

イメージ 4
デザインタブ→データの選択
or
グラフを右クリック→データの選択

イメージ 5
行列の切り替えボタンを押すと入れ替わって
グラフも変化する

イメージ 6
できた、これが基本になってあとは
辻褄が合うようにデータを用意したりレイアウトを変更する


完成図
イメージ 7
少し規模を大きくしてこれを作ってみる


使う日付はそれぞれの作物の
種まき日、発芽日、初開花日、初収穫日、撤去日
全部揃っていなくてもつじつまを合わせればいい

イメージ 8
こんな感じで入力してみる
バジルは開花日や収穫日とか曖昧だから入力していない
これを元にグラフに使うデータを作成する

グラフに使うデータ
イメージ 9
数値は日数、計算は上で入力した日付を使って関数で行っている
トマトの要素の92ってのは基準日とした2016/1/1から種まき日までの日数で
種まき日 - 基準日 = 92日
2016/4/2 - 2016/1/1 = 92
っていうただの引き算なんだけど
日付がないところを計算するとおかしくなるので少し修正してあって
具体的には↓
イメージ 10
この関数をピンク色のセルにオートフィルしている
SUM関数の中が自分自身も入っているから循環参照になっている気がするけどエラーにはなっていない、よくわからんけど期待通りの値が表示されるからOK?

イメージ 11
トマトの開花までの52日は
=IF(E157="",0,E157-$B$156-SUM($C163:E163))
開花日 - 基準日 - (トマトの要素 + トマトの発芽まで) = 52
2016/6/2 - 2016/1/1 - (92 + 9) = 52
153 - (101) = 52

データを元にグラフ作成
イメージ 12
データ範囲を選択して積み上げ横棒グラフを挿入

イメージ 13
やっぱり逆になるので

イメージ 14
データソースの選択画面で行列の切り替えボタンを押してから
OKボタンで修正

表示形式の変更
イメージ 15
日数を月に変更する

軸の書式設定画面を開く
イメージ 16
数値を右クリック→軸の書式設定

ユーザー設定に新しい表示形式を追加する
イメージ 17
表示形式 → 分類のユーザー設定 → 表示形式コードに
m"月"
を入力→ 追加ボタンクリック → 種類のm"月"を選択
これで数値が月に変わる、お仕置きはない模様

軸のオプションで調整
イメージ 21
軸の書式の表示形式から軸のオプションに切り替えて
色々調整

イメージ 22
最小値を固定、数値1
最大値を固定、数値365
目盛間隔を固定、数値を31
にすると
イメージ 23
こうなる、ほぼ完成
ただこの設定はかなりつじつま合わせで
最大値365は1年間の日数でいいんだけど
目盛間隔の31
これは1月の日数のつもりなんだけど
毎月31日まであるわけじゃないのでどんどんずれていく
表示形式を日付まで表示してみると
イメージ 24
こんなふうにずれているのがわかる

じゃあ目盛間隔30にしたら
イメージ 25
余計ひどくなる
なので妥協で31


グラフの色を変更
イメージ 18
種まき前の期間は何も表示したくないので塗りつぶしなしにする
データ系列の書式設定画面を開く
さっきの軸の書式設定画面が開いたままなら
グラフをクリックするだけで切り替わるし
閉じていたら
イメージ 19
グラフを右クリック→
データ系列の書式設定で開く

イメージ 20
塗りつぶし→塗りつぶしなしにチェック入れる
これで色が消える

イメージ 26
色を変えるのは塗りつぶし(単色)とかでできるけど


イメージ 27
せっかくだから俺はこの赤の扉(午後のパレット)を選ぶぜ

グラフのタイトルを入れる
イメージ 28
グラフを選択して
レイアウトタブ→グラフタイトル→グラフタイトルを~かグラフの上

グラフの上を選ぶと
イメージ 29
こうなる 

イメージ 30
フォント変更して完成
Meiryo UIとフロップデザインフォント



その他の設定
イメージ 31
縦軸(作物名の軸)を反転すると
作物名の並びが逆順になって
横軸の月が上側に移動する


棒グラフの幅(太さ)変更
イメージ 32
データ系列の書式設定→系列のオプション画面で
要素間隔を小さくすると太くなる

イメージ 33
要素間隔を大きくすると細くなる

イメージ 34
系列の重なり
これはよくわかんないなあ



データが増えても設定箇所は同じ
イメージ 35





いろいろテスト
イメージ 1
トマトだけ

イメージ 36
重なる時期を別々に表示

イメージ 37
重なる時期を別々に表示その2
凡例を図形で表示している


グラフじゃなくてエクセル方眼紙を使う
イメージ 38
これが一番ラク
色を塗るだけだからあっという間にできるw

図らずもエクセル方眼紙の万能性がまた証明されてしまったけど
もっといい方法ないかしらねえ





エクセルでグラフ色々、3D折れ線グラフの間違った使い方

$
0
0
前回の
園芸サイトによくある植え付けや収穫時期を表す図表をエクセルのグラフで作ってみたメモ ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14662126.html

続き

折れ線グラフ
イメージ 1
かんたんにできる割には悪くない


3D折れ線グラフ
イメージ 2
データラベル(日付)も表示できてかなり理想に近い
けど3D折れ線グラフとしては使い方間違ってるなあ( ´∀`)

4月だけで作ってみる
イメージ 3
1番左の列は2016年にしてあるけど
年はいつでもよくて月日だけつかう
入力するのはそれぞれの項目の期間中の年月日

イメージ 4
この範囲で3D折れ線グラフを挿入すると

イメージ 5
これができる、3Dだなあ

データとの関連
イメージ 6
2016年と2015年では日付は同じでも数値は違うから
表示される高さも全然違うけど
真上から見下ろせば高さの違いはわからなくなるので
その設定

グラフエリアの書式設定
イメージ 7
グラフを右クリックして
グラフエリアの書式設定画面を開いて
3-D回転の項目を開くとこうなっている

Xを0°に変更
イメージ 8
こうなって

Yを90°に変更
イメージ 9
真上から見下ろす感じになる
これでほぼ完成

透視投影を0.1°に変更
イメージ 10
少しスッキリした

奥行きを広くする
イメージ 11
100から290に変更したところ

軸の書式設定
イメージ 12
目盛間隔を変更

イメージ 13
固定にチェック、数値を1に変更、日を月に変更
前回はこれができなかったんだよねえ

表示形式を変更
イメージ 14
n月n日

イメージ 15
この前のユーザー設定を使えばn月

縦軸の数値
イメージ 16
これは要らないので

イメージ 17
右クリックから削除、もしくは

イメージ 18
フォントの色を背景色と同じ白にすれば

イメージ 19
消える

奥行き軸
イメージ 20
グラフと凡例が上下位置が反対になっているので
奥行き軸を反転させる

イメージ 35
軸のオプションの軸を反転するにチェックを入れると
グラフと凡例の順番がおなじになる

こうなると奥行き軸は要らないので
イメージ 21
同じように右クリックから削除



データラベルの表示
イメージ 22
赤文字のところ

イメージ 23
グラフをクリックすると系列全体が選択状態になる
もう一度クリックすると…

イメージ 24
1個だけが選択状態になる
ここで右クリックして

イメージ 25
データラベルの追加で

イメージ 26
表示される

イメージ 27
これも書式設定で色々選べるけど
残念なのが先頭データの表示方法がわからないこと
今回の場合だと最初の種まき日の4/2や2回目の4/12を表示したいんだけど

イメージ 28
先頭の4/12を表示したいから先頭の要素を選択して
データラベルの表示しても

イメージ 29
次の日の4/13になってしまう

イメージ 36
できた



別の方法
グラフに図形を挿入してデータラベルに見立てる
イメージ 30
データラベルが思ったように表示できないなら
図形(テキストボックス)を使えばいいんじゃないかってのがこれ

グラフに図形を挿入
イメージ 31
グラフを選択した状態で
レイアウトタブ→挿入の図形、テキストボックス
これでグラフに挿入した図形のプロパティを見てみると…

イメージ 32
グラフに合わせてサイズを変更するしないの項目が付いているし
グラフを移動させると一緒についてくる、かしこい

イメージ 33
二つ目の縦軸を使って収穫数も表示、こういうのもいいなあ
さっきの真上から見下ろし3D折れ線グラフだとできない
グラフってより図形を使ってお絵描きしているみたい

レーダーグラフ
イメージ 34
なんだこれw
ズラーっと並んでいる日付をスッキリできればいいんだけど
設定項目自体が表示されないから
使い方を間違っているんだろうねえw




午後ツールその54、ウィンドウ枠の固定を引き継いで新しいウィンドウを開く

$
0
0

2017/01/07
新しいウィンドウを開いて整列ボタンで
元のウィンドウにウィンドウ枠固定があった場合には、新しいウィンドウにも同じ位置に枠固定するようにした


イメージ 1
この水平2分割整列ボタンと、その隣の垂直2分割整列ボタンの動きを変更した


イメージ 2
スクロールしても一番上の行と左の2列が隠れないように
C2セルの位置でウィンドウ枠の固定をしている状態のブック
これを水平2分割整列すると…

前回までは
イメージ 3
新しいウィンドウを開くで開かれたウィンドウにはウィンドウ枠の固定がなくなっていた


今回のバージョンでは
イメージ 4
新しく開かれたウィンドウにも元のウィンドウと同じ位置で
枠固定するようにした

イメージ 6
アクティブシート以外の枠固定も引き継ぐ


イメージ 5
垂直2分割整列でも同じく引き継ぐ

これでうっかり元のウィンドウを閉じてしまって、また新たにウィンドウ枠の固定をする手間が省けるようになった!どちらを閉じてもOK!


マクロでウィンドウ枠の固定
イメージ 7
C2セルがアクティブの状態で
↓を実行すると
'アクティブセルの位置でウィンドウ枠の固定
Sub testfreeze()
    ActiveWindow.FreezePanes = True
End Sub
↓C2の位置で枠固定される
イメージ 8

WindowのFreezePanesプロパティにTrueを指定すると
そのWindowのアクティブシートのアクティブセルの位置で固定されるみたい
逆に言うと固定したい位置のセルがアクティブセルではないときには順番に
WindowをActive、SheetをActive、cellをActiveにしないとできない?
めんどくさすぎる
枠の解除はFreezePanesにFalseを指定するだけなんだよねえ

枠固定位置の取得
Sub testfreezeaddress()
    r = ActiveWindow.SplitRow
    c = ActiveWindow.SplitColumn
    MsgBox r & "行目、" & c & "列目"
End Sub
これをさっきC2で固定したウィンドウで実行すると…

イメージ 9
取得できる
WindowのSplitRow、SplitColumnでそれぞれ行列の位置を取得できる
取得できるなら設定もできるんじゃないかと
枠固定を解除してから
Sub testsplitrow()
    ActiveWindow.SplitRow = 3
End Sub
これを実行すると
イメージ 10
なんか違う
これは
イメージ 11
このウィンドウの分割
ってことで枠固定はアクティブセルの位置でしかできないみたい


垂直2分割整列ボタンのマクロ
'元のウィンドウ枠固定があった場合に新しいウィンドウにも同じ位置で枠固定
Sub SplitFreezePanes()
    If ActiveWorkbook.Windows.Count <> 1 Then Exit Sub
    Dim oldW As Window: Set oldW = ActiveWindow
    Dim newW As Window
    Set newW = ActiveWindow.NewWindow '新しいウィンドウを開く
    Dim activeS As Worksheet
    Set activeS = ActiveSheet 'アクティブシートを記録
     '元のウィンドウにウィンドウ枠固定があった場合
     '新しいウィンドウも同じ位置で枠固定する
     'これをシートごとに設定する
    Application.ScreenUpdating = False
    Dim splitR As Long, splitC As Long
    Dim ss As Worksheet
    For i = 1 To oldW.SheetViews.Count
        '元の枠固定位置を取得
        'ウィンドウとシートをアクティブにしないと取得できない
        oldW.Activate
        Set ss = oldW.SheetViews.Item(i).Sheet
        ss.Activate
        If oldW.FreezePanes = True Then '枠固定されているものだけ
            splitR = oldW.SplitRow      '行位置
            splitC = oldW.SplitColumn   '列位置
            '新しく開かれたウィンドウに枠固定指定
            newW.Activate 'アクティブにしないと設定できない
            Set ss = oldW.SheetViews.Item(i).Sheet
            ss.Activate
            Dim r As Range
            Set r = ss.Cells(splitR + 1, splitC + 1)
            r.Activate '枠固定はアクティブセルの位置のみで指定できる
            newW.FreezePanes = True 'アクティブセルの位置で枠固定
        End If
    Next
    '元のアクティブシートをそれぞれのウィンドウでアクティブにする
    oldW.Activate
    activeS.Activate
    newW.Activate
    activeS.Activate
    '水平2分割整列
    ActiveWorkbook.Windows.Arrange xlArrangeStyleHorizontal
    Application.ScreenUpdating = True
End Sub

元のウィンドウのシート全部を一枚づつ切り替えて枠固定の有無を確認して
あったら新しく開かれたウィンドウの同じシートに切り替えて枠固定の設定している
取得も設定もWindowをActive、SheetをActiveってしないとできないので
かなり冗長な感じになっている


ダウンロード


前回の記事
午後ツールその53、ウィンドウの整列、異なるブック(ウィンドウ)の整列 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14655664.html



複数行のセルの値をまとめて1つのテキストボックスにするマクロ

$
0
0


複数行のセルの値をまとめて1つのテキストボックスにする
イメージ 6
こういうマクロを作ってみた


セルにつけるコメント機能
イメージ 1
これはサイズの自動調整機能がないんだよねえ


イメージ 2
テキストボックス(図形)ならサイズの自動調整がある


複数行のセルの値をテキストボックスにするマクロ
Sub AddTextBoxFromCellsValue2()
  '選択されているのがセル以外なら何もしないで終了
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Dim myCells As Range
    Set myCells = Selection
    Set myCells = myCells.Resize(myCells.Rows.Count, 1) '左端の一列
    Dim tlCell As Range
    Set tlCell = myCells.Cells(1) '左上のセル
    
     'テキストボックスに表示する文字列を作成
    Dim str As String: str = tlCell.text
    Dim i As Integer
    For i = 2 To myCells.Cells.Count
        str = str & vbNewLine & myCells.Cells(i).text
    Next
    
    'テキストボックス作成
    Dim myTB As Shape
    Set myTB = ActiveSheet.Shapes.AddTextbox( _
                msoTextOrientationHorizontal, _
                tlCell.Left, tlCell.Top, 100, 10)
    myTB.TextFrame.AutoSize = True 'オートサイズを有効にする
    myTB.Placement = xlMove 'セルに合わせて移動するけどサイズ変更しない
'    myTB.Placement = xlFreeFloating '移動もサイズ変更もしない
    
    With myTB.TextFrame2.TextRange
        .text = str
'       フォントの指定(選択セルのフォントと同じ)
        Dim myFont As Font: Set myFont = tlCell.Font
        With .Font
            .Name = myFont.Name
            .NameFarEast = myFont.Name
            .Size = myFont.Size
        End With
    End With
End Sub


このマクロは選択したセルの左1列の値を使ってテキストボックスを作成する
作成されるテキストボックの書式設定やプロパティは
  • フォントとフォントサイズは選択セルの左上と同じものになる
  • テキストに合わせてサイズを調整するにチェックが入った状態になる
  • セルに合わせて移動するがサイズ変更はしない
これ以外は指定していないから初期値になるはず



イメージ 4
フォントサイズ


イメージ 3
セルに合わせて移動するけどサイズ変更しない


イメージ 5
フォントカラーは無視されて
すべて黒(自動)になる
背景色も無視されて白になるなあ
これは引き継ぐようにしようかなあ





複数行のセルの値をまとめて1つのテキストボックスにするマクロその2

$
0
0

前回の
複数行のセルの値をまとめて1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14674215.html

つづき

イメージ 2
選択セル範囲の左の1列をまとめて1つのテキストボックスにする
行ごとのフォントとフォントサイズと
文字ごとの色に対応した
前回と違うのは
  • 行ごとのフォントとフォントサイズに対応
  • 文字ごとの色に対応
  • 背景色は左上のセルと同じにするようにした、塗りつぶしなしやグラデーションの場合は白背景になる
  • テキストボックスのサイズとプロパティのオブジェクトの位置関係はセルに合わせて移動もサイズ変更もしないに変更した


今回のマクロ
AddTextBoxFromCellsValue3を実行するとテキストボックスを作成する
Sub AddTextBoxFromCellsValue3()
  '選択されているのがセル以外なら何もしないで終了
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Dim myCells As Range: Set myCells = Selection
     '左端の一列
    Set myCells = myCells.Resize(myCells.Rows.Count, 1)
    Dim tlCell As Range
    Set tlCell = myCells.Cells(1) '左上のセル
    
     'テキストボックスに表示する文字列を作成
    Dim str As String: str = tlCell.text
    Dim i As Integer
    For i = 2 To myCells.Cells.Count
        str = str & vbNewLine & myCells.Cells(i).text
    Next
        
    'テキストボックス作成
    Dim myTB As Shape
    Set myTB = ActiveSheet.Shapes.AddTextbox( _
                msoTextOrientationHorizontal, _
                tlCell.Left, tlCell.Top, 100, 10)
    With myTB
        .TextFrame.AutoSize = True 'オートサイズを有効にする
'        .Placement = xlMove 'セルに合わせて移動するけどサイズ変更しない
       .Placement = xlFreeFloating '移動もサイズ変更もしない

        '背景色設定、左上のセルの色が単色ならその色にする
        If tlCell.Interior.ColorIndex <> xlColorIndexAutomatic And _
            tlCell.Interior.ColorIndex <> xlColorIndexNone Then
            .Fill.ForeColor.Rgb = tlCell.Interior.Color
        End If
        '文字の設定
        With .TextFrame2.TextRange
            .text = str '文字列指定
            For i = 1 To .Paragraphs.Count
                'フォントカラーの指定
                Call SetFontColor(.Paragraphs(i), myCells(i))
                'フォントの指定
                Call SetFontToParagraph(.Paragraphs(i), myCells(i))
            Next
        End With
    End With
End Sub

'Paragraphのフォントカラーをセルのフォントカラーに合わせる
Sub SetFontColor(p As TextRange2, r As Range)
    'セルのフォントカラーがNullなら複数の色が指定されているので
    '1文字ごとに色指定する
    If IsNull(r.Font.Color) Then
        For i = 1 To p.Characters.Count
            p.Characters(i, 1).Font.Fill.ForeColor.Rgb _
                = r.Characters(i, 1).Font.Color
        Next
    Else
        p.Font.Fill.ForeColor.Rgb = r.Font.Color
    End If
End Sub

'Paragraphのフォントをセルのフォントに合わせる
Sub SetFontToParagraph(p As TextRange2, r As Range)
    Dim f As Font: Set f = r.Font
    With p.Font
        .Name = f.Name
        .NameFarEast = f.Name
        .Size = f.Size
    End With
End Sub



'背景色設定、左上のセルの色が単色ならその色にする
        If tlCell.Interior.ColorIndex <> xlColorIndexAutomatic And _
            tlCell.Interior.ColorIndex <> xlColorIndexNone Then
            .Fill.ForeColor.Rgb = tlCell.Interior.Color
        End If
テキストボックスの背景色にする色は左上のセルの塗りつぶしの色に合わせる
このとき塗りつぶしの色が単色ならそのままでいいから
            テキストボックス.Fill.ForeColor.Rgb = セル.Interior.Color
これでOK
塗りつぶしなしやグラデーションだった場合は白にしたい
この判定はセル.Interior.ColorIndexの値を見て判定した
塗りつぶしなしのときは
xlColorIndexAutomatic
グラデーションのときは
xlColorIndexNone
なのでどちらかだったときは背景色無指定(白背景)




テキストボックスの中の文字列は1行ごとにParagraphっていうプロパティ?になっている、型はTextRange2


イメージ 1
この場合だとParagraphが4つ
取得は
Dim ps as TextRange2
Set ps = Shape.TextFrame2.TextRange.Paragraphs

これで4行全部取得できて
この中の1行目取得なら

Dim p as TextRange2
Set p = ps(1)


Paragraphのフォントカラーの指定
1行目全部を白にするなら
p.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)

3文字目だけを白にするならCharactersを使って
p.Characters(3, 1).Font.Fill.ForeColor.RGB = RGB(255, 255, 255)

今回は使わないけど
2文字目から4文字分(2~5文字目)を白にするなら
p.Characters(2, 4).Font.Fill.ForeColor.RGB = RGB(255, 255, 255)


セルの文字色取得
全部同じ色なのか2色以上あるのかの判定
2色以上あるときはRange.Font.Colorの値がNullになっているので
If IsNull(Range.Font.Color) Then
こんな感じでIsNullを使って判定できる

全部同じ色なら
p.Font.Fill.ForeColor.RGB = Range.Font.Color
これでOK

2色以上のときは1文字ごとに色を取得、設定するので
これもCharactersを使って
2文字目の色指定なら
p.Characters(2, 1).Font.Fill.ForeColor.Rgb _
= Range.Characters(2, 1).Font.Color



イメージ 4
1文字ごとに色指定の処理をステップ実行しているところ

ヤフーブログに直接載せられるアニメーションGIFは横幅560ピクセル以下なのかも、712x632のものを載せようとしたら以下のメッセージ
イメージ 3
もしかして縮小表示ができないだけかも、ってことで縮小表示にならないように右側を削って幅560ピクセルにしたらうまく載せられた


図形のテキストボックスのタブ文字、タブ位置とかのメモ、選択セル範囲を1つのテキストボックスにするマクロ

$
0
0


図形のテキストボックスのタブ文字、タブ位置とか調べてみた結果
よくわからん(´・ω・`)
エクセル2007は図形に対するマクロの記録ができなくてめんどくさいのでメモ


イメージ 1
このテキストボックスにはa1タブ文字a2タブ文字a3って入っている

テキストボックスのタブの間隔の設定は
テキストボックスShape.TextFrame2.TextRange.ParagraphFormat.TabStops
ってところにあるこのTabStops


TabStopsの中を見てみる
イメージ 2
DefaultSpacing = 72
これがタブの間隔


普通に
テキストボックスのタブの間隔の設定
イメージ 3
テキストボックスの右クリックメニュー→
段落→
インデントと行間隔タブのタブとリーダー→
既定値

この既定値がさっきのDefaultSpacingになっているみたい
既定値2.54とDefaultSpacing72の結果は同じで
それぞれの数値の単位はセンチメートルとポイントなのかも

DefaultSpacingを72から20にすると
イメージ 4
文字間隔が狭くなる

イメージ 5
既定値の方も2.54から0.71へと値が小さくなっている




タブ位置
既定値とは別のタブ位置を追加するのが
タブ位置の設定(追加)
イメージ 6
タブの設定画面のタブ位置に数値を入れて
設定ボタンを押すと追加される


タブ位置を設定した結果
イメージ 8
1つだけ追加して、それぞれ1センチと2センチ3センチにしてみた結果
1と2センチはa2だけが移動して
3センチはa2,a3ともに移動した



1センチを追加したテキストボックスのTabStopsをみてみる
イメージ 7
新しくItem 1ってのが追加されている
その中のPositionがタブ位置のことで
数値28.34646ってのが1センチを表すポイントみたい


タブ位置を2つ追加
1センチと2センチ
イメージ 9
1センチと2センチを追加したら等間隔になった
ってことは前の文字列からの距離じゃなくて一番最初の文字列からの距離


1センチと3センチ
イメージ 10
どうやら追加したタブ位置ってのは前の文字列からじゃなくて
最初の文字列からの距離みたい




タブ位置1センチのところに文字列を追加してみる
イメージ 11
a2のタブ位置が1センチになっているところに
最初の文字列a1に文字を追加してみる

イメージ 12
3文字追加したところ
4文字目だとa2に重なりそうだけど

イメージ 13
4文字目追加したらa2が離れた
この距離はどう見ても1センチじゃなから既定値の数値っぽい


複数行のとき
イメージ 14
指定したタブ位置はすべての行に適用されるみたい
ここで1行目の最初の文字列に文字を追加してみると

イメージ 15
1行目だけタブ位置が変更された
できれば2行目も移動してほしい



タブ位置指定なしのとき
イメージ 16
タブ位置指定なしで既定値だけのとき

イメージ 17
同じように文字を足していくと

イメージ 18
同じ挙動だった…


例えば既定値が5のときのタブの位置は行の先頭からの距離で
5, 10, 15, 20, 25, …ってずーっと続いていて
タブ位置の設定で追加されるのは、この続いている中に追加される
1センチのところに設定したら
1, 5, 10, 15…ってなって
さらに12センチにも設定したら
1, 5, 10, 12, 15…ってなる

この設定の時の文字列の位置は
最初の文字列の長さが1センチを超えていなければ
2番めの文字列は1センチのタブ位置になって、超えていたら
2番めの文字列は5センチのタブ位置になって
2番めの文字列末尾が10センチのところのタブ位置を超えていなければ
3番めの文字列は10センチのタブ位置になって、超えていたら
3番めの文字列は12センチのタブ位置になって
こんなかんじかなあ

まとめると
既定値ってのがテキストエディタとかにもある普通のタブ位置のことで
その中に別のタブ位置を1つ1つ追加するのがタブ位置の設定



選択したテキストボックスのタブの既定値を20に変更するマクロ
Sub ChangeTabSpace()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim tss As TabStops2
    Set tss = s.TextFrame2.TextRange.ParagraphFormat.TabStops
    tss.DefaultSpacing = 20'タブの既定値変更
End Sub
↑を1行で書くと↓
Sub ChangeTabSpace2()
    Selection.ShapeRange.Item(1).TextFrame2.TextRange.ParagraphFormat.TabStops.DefaultSpacing = 20 'タブの既定値変更
End Sub

イメージ 19





選択したテキストボックスにタブ位置20ポイントを追加するマクロ
Sub AddTabStop()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim tss As TabStops2
    Set tss = s.TextFrame2.TextRange.ParagraphFormat.TabStops
    tss.Add msoTabStopLeft, 20'タブ位置追加
End Sub

イメージ 20




'タブ位置すべてを消去するマクロ(2017/01/17に修正)
Sub DeleteTabStops()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim ps As TextRange2
    Set ps = s.TextFrame2.TextRange.Paragraphs
    Dim tss As TabStops2
    Dim i As Long
    Dim ts As TabStop2
    For i = 1 To ps.Count
        Set tss = ps.Item(i).ParagraphFormat.TabStops
        For Each ts In tss
            ts.Clear'消去
        Next
    Next
End Sub



イメージ 21






なんでこんなこと調べているのか
選択セル範囲をテキストボックスにするときに
イメージ 22
こんなふうにしたい
表をそのままの形でテキストボックス


試しに書いてみた
選択セル範囲を1つのテキストボックスにするマクロtestTableTextBox

Sub testTableTextBox()
      '選択されているのがセル以外なら何もしないで終了
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Dim myCells As Range
    Set myCells = Selection
    Dim tlCell As Range
    Set tlCell = myCells.Cells(1) '左上のセル
    
     'テキストボックスに表示する文字列を作成
    Dim str As String
    Dim rRow As Range
    str = testGetString(myCells)
    
    'テキストボックス作成
    Dim myTB As Shape
    Set myTB = ActiveSheet.Shapes.AddTextbox( _
                msoTextOrientationHorizontal, _
                tlCell.Left, tlCell.Top, 100, 10)
    myTB.TextFrame.AutoSize = True 'オートサイズを有効にする
    myTB.Placement = xlMove 'セルに合わせて移動するけどサイズ変更しない
'    myTB.Placement = xlFreeFloating '移動もサイズ変更もしない
    
    With myTB.TextFrame2.TextRange
        .text = str
'       フォントの指定(選択セルのフォントと同じ)
        Dim myFont As Font: Set myFont = tlCell.Font
        With .Font
            .Name = myFont.Name
            .NameFarEast = myFont.Name
            .Size = myFont.Size
        End With
    End With
End Sub


'渡されたセル範囲の値(text)を表形式用に繋げて返す
'1行の値はタブ文字で繋げて、行が変わったら改行文字でつなげる
Function testGetString(r As Range) As String
    Dim str As String
    Dim rr As Range
    Set rr = r.Cells.Rows(1)
    str = GenerateString(rr, True)
    '2行以上あるとき
    If r.Rows.Count > 1 Then
        Dim i As Long
        For i = 2 To r.Rows.Count
            Set rr = r.Cells.Rows(i)
            str = str & vbNewLine & GenerateString(rr, True)
        Next
    End If
    testGetString = str
    
End Function


'文字列生成、
'渡されたセル範囲にある文字列を繋げて返す
'渡すセル範囲は1行か1列のどちらか
'horiはHorizontalで
'Trueならタブ文字でつなげる
'Falseなら改行文字でつなげる
Function GenerateString(r As Range, Optional hori As Boolean = False) As String
    Dim str As String
    str = r.Cells(1).text
    If r.Cells.Count = 1 Then
        GenerateString = str
        Exit Function
    End If
    '2セル以上のとき
    Dim i As Long
    If hori Then
        'タブ文字でつなげる
        For i = 2 To r.Cells.Count
            str = str & vbTab & r.Cells(i).text
        Next
    Else
        '改行文字でつなげる
        For i = 2 To r.Cells.Count
            str = str & vbNewLine & r.Cells(i).text
        Next
    End If
    GenerateString = str
End Function

テキストボックスにしたい範囲を選択して
testTableTextBoxを実行すると
イメージ 23
できた

でもタブ位置は指定していないマクロなので
既定値を超えた幅を持つ文字列の場合は
イメージ 24
やっぱりズレてしまう

タブ位置の指定が必要なのと
右寄せとかもあったほうがいいなあ

イメージ 25
タブの設定の配置のところで右寄せできるみたいねえ
VBAなら
イメージ 26
TabStopのTypeプロパティかな
このあたりは次回



前回(関連記事)
複数行のセルの値をまとめて1つのテキストボックスにするマクロその2 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14676410.html












選択セル範囲を図形のテキストボックスにするマクロその2、タブ位置調整

$
0
0

前回
図形のテキストボックスのタブ文字、タブ位置とかのメモ、選択セル範囲を1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14686706.html

の続き

目的
イメージ 1
選択セル範囲をテキストボックスにするときに
見た目を同じにする


テキストボックスの文字の中央揃え
イメージ 2
中央揃えにしたいところを選択するとツールバーみたいなのが出てくる
その中に中央揃えにするボタンがあるのでクリックで中央揃えになる
けど、この方法では行ごとにしか指定できないので

イメージ 3
こんなふうに3.6っていう数値だけ、とかはできなくて
同じ行にあるbottomっていう文字も一緒に移動してしまう
これを解決するのがこの前の記事でもあった
タブの設定、タブ位置の設定
タブの設定画面を出す
前回の記事からの流用
今回は複数行あるから全部の行を選択して
イメージ 4
右クリックメニューから段落


1cmのところにタブを追加する
イメージ 5
中央揃えにするから配置は中央を選択してから
設定してOKボタン
これで中央揃えになるのかなあと思ったら

イメージ 6
変化なし

イメージ 7
左から1cmのところに追加したタブがあるはずなので

イメージ 8
2行目の先頭にカーソルを置いてtabキーを押してあげると

イメージ 9
中央揃えになった!

イメージ 10
他の行も頭にタブを入れると中央揃えになる

3行目の7.2を右揃えにしてみる
イメージ 11
3行目のタブ設定画面でさっきの1cmのタブ位置をクリアボタンで消して

イメージ 12
おなじ1cmにして、配置を右にして設定ボタンで追加
OK押してみてみると

イメージ 13
3行目だけ右揃えになった

イメージ 14
こんな感じになっているんだろうねえ
ってことはマクロで処理するときは
文字列の頭にタブ文字(vbTab)を追加してあげればいいことになる

例えば
イメージ 20
左の選択セル範囲から作った右のテキストボックスの中のテキストは
vbTab & Margin & vbTab & DefaultValue & vbNewLine & vbTab & Bottom & vbTab & 3.6
になっている、vbNewLineは改行文字



イメージ 15
タブ位置を追加しないときのタブ位置は
イメージ 16
この既定値の2.54cmが使われて
配置は左揃えになっているので
これらを変更してあげればいいみたい

既定値は0にする
そうしないとタブ位置を1cmと3cmに追加した場合でも
1cmの次のタブは3cmではなく
既定値の2.54cmになってしまうから





追加するタブ位置の決定はセル幅を基準にする

テキストボックスの1行目にタブ位置50配置左を追加するときは
テキストボックス.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops.Add msoTabStopLeft, 50


イメージ 17
自身のセルの前のセル幅をTabStops.Positionに使うとピッタリな感じ
全部左揃えならこれで問題ない
3列め以降はこの数値にどんどん足していく
2列目の幅が66なら64+66=130が3列目のタブ位置になる


二列目の数値のところは中央揃えにしたいからもっと右にしたい
これは自身(3.6)があるセル幅の半分を足せば良さそうってことで
自身のセル幅66の半分33を64に足して97!
イメージ 18
中央揃えにしたいから
TabStops.TypeはmsoTabStopCenter
追加だから
TabStops.Add msoTabStopcenter, 97



右揃え
イメージ 19
自身のセル幅付近に追加してTabStops.TypeはmsoTabStopRight
64ピッタリじゃなくて64付近なのか
もしDefaultValueの数値(3.6)があるセルが左揃えだった場合
左揃えのときは自身のセルの前のセル幅を使うのでタブ位置64
bottomがあるセルは右揃えなのでタブ位置は自身のセル幅64
別の文字列が同じタブ位置を使うことはできないので不都合が起こるから
なので右揃えのときは前のセル幅にプラスかマイナスした数値を使うってことで付近


タブ位置の決定
左揃え
前のセル幅を使い列ごとにどんどん足していく、これを基準値にする
中央揃え
基準値に自身のセル幅の半分を足す
右揃え
基準値に自身のセル幅を足した値付近


選択セル範囲をテキストボックスにするマクロその2
testTableTextBox2を実行するとテキストボックスができる
'中央揃え、右揃えに対応版
'セル範囲をテキストボックス
Sub testTableTextBox2()
      '選択されているのがセル以外なら何もしないで終了
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Dim myCells As Range:    Set myCells = Selection
    Dim tlCell As Range:    Set tlCell = myCells.Cells(1) '左上のセル
    
    'テキストボックス作成
    Dim myTB As Shape
    Set myTB = ActiveSheet.Shapes.AddTextbox( _
                msoTextOrientationHorizontal, _
                tlCell.Left, tlCell.Top, 100, 10)
    myTB.TextFrame.AutoSize = True 'オートサイズを有効にする
    myTB.Placement = xlMove 'セルに合わせて移動するけどサイズ変更しない
'    myTB.Placement = xlFreeFloating '移動もサイズ変更もしない
    
    'テキストボックスに表示する文字列を作成
    Dim str As String
    Dim rRow As Range
    str = testGetString2(myCells)
    'テキストボックスにテキスト指定
    myTB.TextFrame2.TextRange.text = str
    
    'フォントカラーとフォントの設定
    Call SetFontColorAndFont(myTB, myCells)
    'セル幅に合わせたタブ位置を設定する
    Call AddTabPosition(myTB, myCells)
    
End Sub





'渡されたセル範囲の値(text)を表形式用に繋げて返す
'1行の値はタブ文字で繋げて、行が変わったら改行文字でつなげる
Function testGetString2(r As Range) As String
    Dim str As String
    Dim rr As Range
    Set rr = r.Cells.Rows(1)
    '先頭にタブ文字を入れているのは
    '文字の水平位置が左寄せの他にも対応するためで
    'これがないと最初の文字列が必ず0から始まってしまい
    'もし最初のセルが左寄せ以外のときでも0になってしまうから
    str = vbTab & GenerateString(rr, True)
    
    '2行以上あるとき
    If r.Rows.Count > 1 Then
        Dim i As Long
        For i = 2 To r.Rows.Count
            Set rr = r.Cells.Rows(i)
            str = str & vbNewLine & vbTab & GenerateString(rr, True)
        Next
    End If
    testGetString2 = str
    
End Function


'文字列生成、
'渡されたセル範囲にある文字列を繋げて返す
'渡すセル範囲は1行か1列のどちらか
'horiはHorizontalで
'Trueならタブ文字でつなげる
'Falseなら改行文字でつなげる
Function GenerateString(r As Range, Optional hori As Boolean = False) As String
    Dim str As String
    str = r.Cells(1).text
    If r.Cells.Count = 1 Then
        GenerateString = str
        Exit Function
    End If
    '2セル以上のとき
    Dim i As Long
    If hori Then
        'タブ文字でつなげる
        For i = 2 To r.Cells.Count
            str = str & vbTab & r.Cells(i).text
        Next
    Else
        '改行文字でつなげる
        For i = 2 To r.Cells.Count
            str = str & vbNewLine & r.Cells(i).text
        Next
    End If
    GenerateString = str
End Function



'テキストボックスのフォントカラーとフォントをセルと同じにする
'sはテキストボックス(図形)、tableRにはセル範囲を渡す
Sub SetFontColorAndFont(s As Shape, tableR As Range)
    Dim i As Long, j As Long, k As Long
    Dim r As Range, rowR As Range
    Dim p As TextRange2
    
    'Paragraph(1行)ごとに処理
    'Paragraphの文字列はtab, text, tab, text...って並んでいる
    For k = 1 To tableR.Rows.Count
        Set p = s.TextFrame2.TextRange.Paragraphs(k)
        Set rowR = tableR.Cells.Rows(k) '1行
        Dim cStart As Long '処理する文字のスタート位置
        '最初の文字はタブ文字で色は関係ないのでスタート位置は1
        cStart = 1
        '1セルごとに処理
        Dim char As TextRange2 ' Characters
        For i = 1 To rowR.Cells.Count
            Set r = rowR.Cells(i) '1セル
            '空白セルなら処理をスキップ
            If Len(r.text) = 0 Then GoTo myErr
            
            Set char = p.Characters(cStart + 1, Len(r.text))
            'セルのフォントカラーがNullなら複数の色が指定されているので
            '1文字ごとに色指定する
            If IsNull(r.Font.Color) Then
                For j = 1 To r.Characters.Count
                    p.Characters(cStart + j, 1).Font.Fill.ForeColor.Rgb _
                        = r.Characters(j, 1).Font.Color
                Next
            Else
                '1セルごとに色指定
                p.Font.Fill.ForeColor.Rgb = r.Font.Color
            End If
            
            '1セルごとにフォント設定
            With char.Font
                .Name = r.Font.Name
                .NameFarEast = r.Font.Name
                .Size = r.Font.Size
            End With
myErr:
            '次に処理する文字のスタート位置
            cStart = cStart + Len(r.text) + 1
        Next
    Next k
End Sub




'図形の中のテキストにタブ位置を追加
'セル範囲と図形を渡す
'セル幅を使うのでテキストとセルの値が対応している必要がある
Sub AddTabPosition(tb As Shape, r As Range)
    Call ClearTabStops(tb) 'タブ位置をすべて消去
    Dim ps As TextRange2
    Set ps = tb.TextFrame2.TextRange.Paragraphs
    Dim i As Long
    '1行ごとにタブ位置を追加
    For i = 1 To ps.Count
        'タブの既定値は邪魔なので0にする
        ps.Item(i).ParagraphFormat.TabStops.DefaultSpacing = 0
        '1行ごとタブ位置追加
        'Call AddTabPositionSub(ps.Item(i), r.Cells.Rows(i))
        '中央揃え対応版
        Call AddTabPositionSub2(ps.Item(i), r.Cells.Rows(i))
    Next
End Sub


'タブ位置すべてをクリア
'渡された図形の中のテキストのタブ位置を消去
Sub ClearTabStops(s As Shape)
    '図形にテキストがなければ何もしないで終了
    If s.TextFrame2.HasText = msoFalse Then Exit Sub
    Dim ps As TextRange2
    Set ps = s.TextFrame2.TextRange.Paragraphs
    Dim tss As TabStops2
    Dim i As Long
    Dim ts As TabStop2
    For i = 1 To ps.Count
        Set tss = ps.Item(i).ParagraphFormat.TabStops
        For Each ts In tss
            ts.Clear
        Next
    Next
End Sub


'タブ位置を追加、位置はセル幅を元に設定する
'左揃え、中央揃え、右揃えに対応
'pfはParagraph、rは1行のセル範囲
'AddTabPositionと一緒に使う
Sub AddTabPositionSub2(pf As TextRange2, r As Range)
    Dim po As Single 'タブ位置Position
    Dim tss As TabStops2
    Set tss = pf.ParagraphFormat.TabStops
    Dim nowR As Range: Set nowR = r.Cells(1)
    '先頭のタブ位置を追加
    Call SetTabStop(nowR, tss, 0)
    po = tss.Item(1).Position
        
    'セルが1個だけのときはここで終了
    If r.Cells.Count = 1 Then Exit Sub

    'セルが2個以上のとき
    '2番目以降のタブ位置を追加
    Dim beforeR As Range
    Dim i As Long
    For i = 2 To r.Cells.Count
        Set beforeR = r.Cells(i - 1)
        Set nowR = r.Cells(i)
        
        '1つ前のタブ位置に1つ前のセル幅を足す
        'これが次のタブ位置の基準になる
        po = po + beforeR.Width
        
        'タブ位置の調整
        If beforeR.HorizontalAlignment = xlCenter Then
            '1つ前のセルが中央揃えのとき、1つ前のセル幅の半分をひく
            po = po - (beforeR.Width / 2)
        ElseIf beforeR.HorizontalAlignment = xlRight _
            Or (IsNumeric(beforeR.Value2) _
                And beforeR.HorizontalAlignment = xlGeneral) Then
            '1つ前のセルが右揃えのとき、1つ前のセル幅分をひく、4は調整
            po = po - beforeR.Width + 4
        End If
        
        'タブ位置を追加する
        Call SetTabStop(nowR, tss, po)
    Next
End Sub


'タブ位置を調整してから追加
'セルのHorizontalAlignmentとセル幅に依って調整
Sub SetTabStop(r As Range, tss As TabStops2, po As Single)
    'タブ位置を追加する
    If r.HorizontalAlignment = xlCenter Then
        'セルが中央揃えのとき、セル幅の半分を足す
        po = po + (r.Width / 2)
        tss.Add msoTabStopCenter, po
    ElseIf r.HorizontalAlignment = xlRight _
        Or (IsNumeric(r.Value2) _
            And r.HorizontalAlignment = xlGeneral) Then
        '右揃えか数値(指定なしだと数値は通常右揃え)のときだけは
        '調整で-4、こうしておくと右揃えの次に左揃えが来たときに
        'タブ位置が重なること防ぐことになるし、見た目も良くなる
        po = po + r.Width - 4
        tss.Add msoTabStopRight, po
    Else
        '左揃えか指定なしの文字列のとき
        tss.Add msoTabStopLeft, po
    End If
End Sub



長いなあ
1行だけや1列だけのときと複数行複数列ある時の分け方がうまく書けてない気がする


イメージ 21
セルの書式設定の配置で対応しているのは横位置の

イメージ 22
中央揃えと右詰めだけで
それ以外はすべて左揃えになるはず


イメージ 23
フォントカラーは1文字ごとに対応
フォントはセルごとに対応



関連記事、古い順
複数行のセルの値をまとめて1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14674215.html


複数行のセルの値をまとめて1つのテキストボックスにするマクロその2 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14676410.html

前回
図形のテキストボックスのタブ文字、タブ位置とかのメモ、選択セル範囲を1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14686706.html












選択セル範囲を図形のテキストボックスにするマクロその3、図形の四角形をテキストボックス化

$
0
0



"普通のテキストボックス"と"図形にテキストを追加したもの"とではどんな違いがあるのかを少し調べてみた
結果は
  • ほとんど違いがない
  • 移動させるときは図形のほうがラク
  • 初期の見た目が違うけど設定で全く同じようにすることができる
  • これからはテキストボックスのかわりに図形にテキストを追加して使おう

移動させるときは図形のほうがラク
イメージ 12
図形の方はマウスでつかめる範囲も広く、1回のクリックで掴んで移動できる



初期の見た目が違うけど設定で全く同じようにすることができる
イメージ 15
見た目で違うのは色や線の太さ、文字の配置、これらは設定で色々変更できるので


イメージ 14
テキストボックスを図形の四角形のようにできるし


イメージ 13
図形の四角形をテキストボックスのようにもできる

ってことは図形の四角形の見た目をテキストボックスにすれば
移動がラクなテキストボックスができあがる!




VBAで見た目を変更するには
どのプロパティがどこに関連しているのか知る必要があるので
イメージ 16
左から四角形、四角形にテキスト追加、テキストボックス
それぞれをShape型のオブジェクト変数に入れて中を覗いてみる  

イメージ 1
AutoShapeTypeは3つともmsoShapeRectangleだけど
TypeはmsoAutoShape、msoAutoShape、msoTextBoxとなっていて、四角形とテキストボックスとで区別がつけられるようになっている


Shape.TextFrame
イメージ 2
テキスト全体の水平位置のHorizontalAlignmentと
テキスト全体の垂直配置のVerticalAlignmentが違う
イメージ 3
テキストボックスのHorizontalAlignmentは指定なしになっているけど、見た目ではLeft

これらの設定は、このホームタブの配置と
イメージ 8
右クリックメニューから図形の書式設定の
イメージ 9
テキストボックスの垂直方向の配置
このあたりが関係しているみたい
エクセル2007は図形に対するマクロの記録ができないから手間がかかってめんどくさいので、このあたりは正確ではないかも

Shape.TextFrame2プロパティ
イメージ 4
HasTextはテキストの有無を表しているみたい、図形だけの左のものだけFalseになっている

テキストの1行ごとの書式設定の
Shape.TextFrame2.TextRange.ParagraphFormat.Alignment
これの設定は
イメージ 5
テキスト部分の右クリックメニューからの段落の設定画面のところ

イメージ 6
四角形の段落の横配置は中央揃え

イメージ 7
テキストボックスは指定なし
多分このあたりだと思う
テキストボックスは指定なしというか空白になっていて、値だとmsoAlignMixedになっているけど、見た目ではLeftだねえ


Shape.Line
イメージ 10
テキストボックスの枠の色は
Shape.Line.ForeColor.ObjectThemeColorでmsoThemeColorLight1が指定されていて、色の濃淡のTintAndShadeは-0.5が指定されている、マクロで指定するときはRGBを使いたいから一旦テーマカラーで指定してRGBが出たところで指定し直す。
枠の太さはShape.Line.Weight

あとは背景色が違う、これはShape.Fill.ForeColor.RGBにvbWhite(白)を指定

まとめると
図形の四角形にテキスト追加して見た目をテキストボックスのようにするには
Shape(四角形)の
  • TextFrame2.ParagraphFormat.Alignment = msoAlignLeft
  • TextFrame.HorizontalAlignment = xlHAlignLeft
  • TextFrame.VerticalAlignment = xlVAlignTop
  • Line.Weight = 0.75
  • Line.ForeColor.ObjectThemeColor = msoThemeColorLight1
  • Line.ForeColor.TintAndShade = -0.5
  • Line.ForeColor.RGB = Line.ForeColor.RGB
  • Fill.ForeColor = vbWhite


前回のtestTableTextBox2メソッドを変更してできたのがTableTextBoxtest

'図形の四角形にテキスト追加バージョン
'2017/01/23
Sub TableTextBoxtest()
      '選択されているのがセル以外なら何もしないで終了
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Dim myCells As Range:    Set myCells = Selection
    Dim tlCell As Range:    Set tlCell = myCells.Cells(1) '左上のセル
    
    'テキストボックス作成
    Dim myTB As Shape
    Dim ws As Worksheet: Set ws = ActiveSheet
    Set myTB = ws.Shapes.AddShape(msoShapeRectangle, _
        tlCell.Left, tlCell.Top, 100, 100)
    
'    テキストボックスに表示する文字列を作成
    Dim str As String
    Dim rRow As Range
    str = testGetString2(myCells)
    With myTB
        With .TextFrame2.TextRange
            'テキストボックスにテキスト指定
            .text = str
            '全体の段落の水平位置を左寄せに指定
            .ParagraphFormat.Alignment = msoAlignLeft
        End With
        With .TextFrame
            'テキスト全体の水平位置を左寄せに指定
            .HorizontalAlignment = xlHAlignLeft
            'テキスト全体の垂直位置を上寄せに指定
            .VerticalAlignment = xlVAlignTop
            .AutoSize = True 'オートサイズを有効にする
        End With
        .AlternativeText = "TextBox" '識別用に名前をつける
        .Placement = xlMove 'セルに合わせて移動するけどサイズ変更しない
'        .Placement = xlFreeFloating '移動もサイズ変更もしない
        .Fill.ForeColor.Rgb = vbWhite'背景色は白
        
        '枠線の設定
        With .Line
            .Weight = 0.75'太さ
            .Style = msoLineSingle '1本線
            '枠線の色
            With .ForeColor
                'テーマカラーのLight1のShade-0.5をRGB指定
                .ObjectThemeColor = msoThemeColorLight1
                .TintAndShade = -0.5
                .Rgb = .Rgb
            End With
        End With
    End With
    
    'フォントカラーとフォントの設定
    Call SetFontColorAndFont(myTB, myCells)
    'セル幅に合わせたタブ位置を設定する
    Call AddTabPosition(myTB, myCells)
    
End Sub
これ以外のメソッドは前回と全く同じ


イメージ 11
1回でつかめるほうが便利


今回のマクロのエクセルファイルダウンロード

前回の記事
選択セル範囲を図形のテキストボックスにするマクロその2、タブ位置調整 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14689931.html


選択セル範囲を図形のテキストボックスにするマクロその4、フォントの取り消し線、下付き上付き文字、下線

$
0
0


イメージ 1
今までフォントの設定で反映していたのは文字色、フォント名、フォントサイズ、この3つだったけどその他も対応することにした


セルの書式設定のフォント設定画面
イメージ 2
よく使うのは太字くらいかなあ、全く使わないのは下線と文字飾り、それでも全部対応することにした


テキストボックスのフォント設定
イメージ 5
設定できる項目はセルのフォント設定とだいたい同じ
テキストボックスのほうが項目が多い


取り消し線
イメージ 9
セルもテキストボックスも同じに見える、いいねえ

選択されたテキストボックスの文字全部に取り消し線を表示するマクロ
Sub testFont2()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim f2 As Font2
    Set f2 = s.TextFrame2.TextRange.Font
    f2.Strikethrough = msoTrue
End Sub
フォントの設定なのでテキストボックスのフォント設定は
テキストボックスのTextFrame2.TextRange.Font
これに対して色々設定すればいいみたい、前々回のフォントサイズとかと一緒

上付き文字と下付き文字
イメージ 10
これもほぼ再現できている
ただわからないのが
イメージ 11
この相対位置
これを50%にすると
イメージ 12
上に移動してよりセルの表示に近くなる
これをマクロで指定したいんだけど場所がわからない

選択されたテキストボックスの文字全部を上付き文字にするマクロ
Sub testFont2()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim f2 As Font2
    Set f2 = s.TextFrame2.TextRange.Font
'    f2.Strikethrough = msoTrue
    f2.Superscript = msoTrue '上付き文字にする
'    f2.Subscript = msoTrue '下付き文字にする
End Sub
Font2のSuperscriptにmsoTrueを指定するだけで上付き文字になるのはいいけど
表示位置を指定する相対位置ってのがどこにあるのかわからないし、ググっても見つからない
こんなときマクロの記録ができれば1回でわかるんだよなあ



太字、斜体
イメージ 13
OK

選択されたテキストボックスの文字全部を太字、斜体にするマクロ
Sub testFont2()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim f2 As Font2
    Set f2 = s.TextFrame2.TextRange.Font
'    f2.Strikethrough = msoTrue
'    f2.Superscript = msoTrue '上付き文字にする
'    f2.Subscript = msoTrue '下付き文字にする
    f2.Bold = msoTrue '太字
    f2.Italic = msoTrue '斜体
End Sub
取り消し線とかと同じ





セルの下線、Underline
イメージ 3
4種類ある

それぞれどんな表示になるのか
イメージ 4
下線(会計)ってのは文字の下だけじゃなくて
セルの幅いっぱいに下線が引かれるみたい
これは再現できそうにない


テキストボックスの下線の種類
イメージ 6
やっぱり文字列がないところまで線を伸ばすのはなさそうね

結果
イメージ 7
二重下線は一本の太い線に見えるけど

イメージ 8
フォントサイズを大きくすると二重になっているのがわかる、微妙…

Font2のUnderlineStyleに下線の種類を指定する
イメージ 14
なんかいっぱい候補が出てくるけど使うのは
一重線のmsoUnderlineSingleLine
二重線のmsoUnderlineDoubleLine
のどちらかだけ

選択されたテキストボックスの文字全部に下線を表示するマクロ
Sub testFont2()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim f2 As Font2
    Set f2 = s.TextFrame2.TextRange.Font
    f2.UnderlineStyle = msoUnderlineSingleLine '下線
'    f2.UnderlineStyle = msoUnderlineDoubleLine '二重線の下線
End Sub



セルのフォントの設定はセルごとに指定できるのはもちろん、1文字ごとにも指定できる
1文字ごとに調べてテキストボックスの方の文字も設定すれば1番確実だけど、処理時間がかかりすぎる!試しに実行したところ100文字で5秒以上かかったw
セルの中で複数の設定があるかどうかは判定できるので、同じだった場合はセル単位で設定して、違っていた場合だけ1文字ごとに設定するようにした

判定方法
例えば1セルの中すべてが太字だった場合は
セルのFont.Boldの値はTrueだけど
1セルに太字指定の文字と指定なしの文字がある場合は
セルのFont.Boldの値はNullになっている
なのでNullなら混在って判定ができる
これは下線とかでも同じで混在していたらNullになっている

sTextがテキストボックスの文字列、rがセル
'フォント太字
Sub SetFontBoldSub(sText As TextRange2, r As Range)
    If IsNull(r.Font.Bold) Then
        For i = 1 To sText.Characters.Count
            sText.Characters(i, 1).Font.Bold = _
                r.Characters(i, 1).Font.Bold
        Next
    Else
        sText.Font.Bold = r.Font.Bold
    End If
End Sub
すべて太字か標準なら
sText.Font.Bold = r.Font.Bold

太字と標準が混じっていたら1文字ごとなのでCharactersを使って
For i = 1 To sText.Characters.Count
    sText.Characters(i, 1).Font.Bold = _
        r.Characters(i, 1).Font.Bold
Next

下線の場合はTrue、Falseの指定じゃないので少し違う
'フォント下線
Sub SetFontUnderLineSub(sText As TextRange2, r As Range)
    Dim rf As Font
    Dim sf As Font2
    If IsNull(r.Font.Underline) Then
        For i = 1 To sText.Characters.Count
            Set rf = r.Characters(i, 1).Font
            Set sf = sText.Characters(i, 1).Font
            Select Case rf.Underline
                Case xlUnderlineStyleSingle, xlUnderlineStyleSingleAccounting
                    sf.UnderlineStyle = msoUnderlineSingleLine

                Case xlUnderlineStyleDouble, xlUnderlineStyleDoubleAccounting
                    sf.UnderlineStyle = msoUnderlineDoubleLine
            End Select
        Next
    Else
        Set rf = r.Font
        Set sf = sText.Font
        Select Case rf.Underline
            Case xlUnderlineStyleSingle, xlUnderlineStyleSingleAccounting
                sf.UnderlineStyle = msoUnderlineSingleLine

            Case xlUnderlineStyleDouble, xlUnderlineStyleDoubleAccounting
                sf.UnderlineStyle = msoUnderlineDoubleLine
        End Select
    End If
End Sub
Case xlUnderlineStyleSingle, xlUnderlineStyleSingleAccounting
                sf.UnderlineStyle = msoUnderlineSingleLine
Case 下線か下線(会計)なら
テキストボックスの文字 = 下線
同じこと2回書いている…Select Caseのところを別のメソッドにすれば良かったのかな



こんなかんじで他の設定分も同じように書いていたらコードも400行と長くなって、ブログには載せられないけど処理速度はだいぶ改善
イメージ 15
105文字あるけどセル単位で設定されているので
これなら1秒もかからない
個人的にはセル単位でしか書式設定はしないからこれでOK


1文字ごとに処理が必要になる状況
イメージ 16
102文字を1文字ごとに色、太字、下線、サイズを設定
これでも1.5秒くらいでできた


それにしても今回の記事は地味だなあ( ´∀`)


今回のマクロのダウンロード



前回の記事
選択セル範囲を図形のテキストボックスにするマクロその3、図形の四角形をテキストボックス化 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14701540.html






選択セル範囲を図形のテキストボックスにするマクロその5、テキストボックスの余白と行間隔

$
0
0


列幅の自動調節
イメージ 2
普通は調節したい列の右側をダブルクリックで調節するか
Columns("b").AutoFit
これだと一番長い文字列に合わせられるけど
短い文字列の幅に合わせたいときもある!


B列の幅の調節でB3の「いいい」に合わせたいとき
イメージ 1
Range("b3").Columns.AutoFit
これを実行するとピッタリになる


B3とB4の文字列に合わせたいとき
イメージ 4
Range("b3:b4").Columns.AutoFit
このときはB3より長い文字列のB4の方に合わせられる
こんな感じで指定したセル範囲の文字列に合わせることもできる
これを使って


セル幅があっていない範囲をテキストボックス化すると
イメージ 3
見やすいものができる

イメージ 5
いいねえ





イメージ 21
セル範囲の大きさ、余白、文字の配置
これらを調整してセル範囲そっくりなテキストボックスを作ってみたい
文字の配置は前回までで終わっているので


テキストボックスの余白設定
イメージ 6
図形の書式設定からできる

マクロだと
テキストボックスの
TextFrame2の4つのMarginプロパティに値を指定する
この値はセンチメートルじゃなくてポイントかなあ
0.25cmは7.2,0.13cmは3.6になる
選択したテキストボックスの余白を初期値にするマクロ
Sub yohaku()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    With s.TextFrame2
        .MarginBottom = 3.6
        .MarginLeft = 7.2
        .MarginRight = 7.2
        .MarginTop = 3.6
    End With
End Sub


イメージ 7
文字を選択状態にするとどこから余白扱いになっているのかわかりやすい


イメージ 8
余白0にしたところ
真ん中は文字の左と0を選択した状態、これだと左右の余白0ってのがわかる
右側の全選択したものは右側が枠の外側になっている、これは改行文字の分が外側に出ていて、改行文字は文字範囲には含まれないってことかなあ
上下の余白も0なんだけど余白があるようにみえるのは、行間のぶんが余白に見えているのかも



テキストボックスの行間の設定
イメージ 9
段落からできる

試しに全行選択して行間を1行から2行に変更してみる
イメージ 10
たしかに2倍くらいに広がった、文字の下側より上側のほうが広がっているなあ
一番下を見ると余白を無視して枠の外側に出ているように見える


行間、固定値
イメージ 11
行間を固定値にしたら間隔の数値が19.2ptと表示されて
この数値を変更できるようになった

19.2から40に変更
イメージ 13
さっきの行指定とは少し違う感じ


行間を倍数指定
イメージ 12
倍数指定したら初期値が3だったのでそのままOK押したら
大きく広がった、3行分て意味かなあ
それにしても上下均等じゃなくて文字の上側が大きく広がる



段落前後の間隔
イメージ 14
段落前を24pt

イメージ 15
段落後を24pt

これらの行間隔を
マクロの場合はどこを指定すればいいのか
テキストボックス全体に指定するなら
TextFrame2.TextRange.ParagraphFormatの中にある
行(段落)単位で指定するとき、1行(段落)目なら
TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat
イメージ 16
SpaceAfterが段落後
SpaceBeforeが段落前
SpaceWithinが行間と間隔

LineRuleAfter、LineRuleBefore、LineRuleWithinの3つは指定数値をポイント単位にするか行単位にするかの切り替え用でmsoTrueかmsoFalseどちらかの値を指定
例えばLineRuleAfter = msoTrueのときSpaceAfter = 1は
段落後に1行分のスペースって意味になる
LineRuleAfter = msoFalseのときSpaceAfter = 1は
段落後に1ポイント分のスペースって意味になる


Sub 選択したテキストボックスの行間を07行にするマクロ()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    With s.TextFrame2.TextRange.ParagraphFormat
        .LineRuleWithin = msoTrue
        .SpaceWithin = 0.7
    End With
End Sub
イメージ 17


Sub 選択したテキストボックスの行間を15pointにするマクロ()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    With s.TextFrame2.TextRange.ParagraphFormat
        .LineRuleWithin = msoFalse
        .SpaceWithin = 15
    End With
End Sub
イメージ 18




Sub 選択したテキストボックスの段落前空間を1行にするマクロ()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    With s.TextFrame2.TextRange.ParagraphFormat
        .LineRuleBefore = msoTrue
        .SpaceBefore = 1
    End With
End Sub
イメージ 19
これは1行を指定しても表示はポイントに変換される




Sub 選択したテキストボックスの2行目の行間隔を50pointにするマクロ()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    With s.TextFrame2.TextRange.Paragraphs.Item(2).ParagraphFormat
        .LineRuleWithin = msoFalse
        .SpaceWithin = 50
    End With
End Sub
イメージ 20



以上で設定方法はわかったので設定値を調整してできたのが
イメージ 22
ほぼ同じだけど少しズレていて
テキストボックスの背景を透明にしてセルに重ねてみると

イメージ 23
ずれているのがわかる

テキストボックスの文字だけ赤にして重ねた
イメージ 24
約1ピクセル上にずれているかなあ
でもこれ以上調整できなかった


    'マージン(余白)設定
    With myTB.TextFrame2
        .MarginBottom = 0
        .MarginLeft = WorksheetFunction.RoundUp(myCells(1).Height / 10, 0)
        .MarginRight = .MarginLeft ' 2
        .MarginTop = 0
    End With
    
    '行間調整、セルの高さを再現
    With myTB.TextFrame2.TextRange
        For i = 1 To .Paragraphs.Count
            With .Paragraphs(i).ParagraphFormat
                .LineRuleWithin = msoFalse
                .SpaceWithin = myCells.Rows(i).Height * 0.98
            End With
        Next
    End With
セルの高さを基準に余白と行間隔を設定している
何か根拠があるわけじゃなくて調整しただけだからフォントやフォントサイズが違うともっとズレるかも


イメージ 25
今回ので3,4,5,6ができるようになったけど…見やすいのは列幅調整だけの2番かなあ、次に列幅調整と行間隔調整した6番。調整しまくっている3、4番はみやすさで言ったらイマイチだねえ
余白が大事なのがわかったw


4番を作るマクロのエクセルファイル



セル範囲のテキストボックス化は気が済んだので、次はどんなふうにアドインに入れるかだなあ


関連記事、前回
選択セル範囲を図形のテキストボックスにするマクロその4、フォントの取り消し線、下付き上付き文字、下線 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14705381.html




にんにくとイチゴのベランダ菜園、2016年12月中旬から今日までの様子

$
0
0


2016年12月中旬から今日(2017年1月28日)までのまとめ

今日のにんにくの様子
イメージ 2
ビニールかけっぱなし、最大瞬間風速が20m/sを超える日も何度かあったけど壊れていなかった、四角錐は丈夫だなあ

イメージ 3
中の様子、にんにくも大きくなっていたけど雑草も立派になっていた



去年12月
イメージ 1
45日前の様子になるけど、あんまり今と変わらない感じだねえ

イメージ 4
変化がないからコメントに窮する

イメージ 5
正月

イメージ 6
雑草が育ってきて気になるけど
ビニールを外すのがめんどくさくて放置


イメージ 7
少しづつは成長しているはず

そして今日
イメージ 8
やっぱりあまり変わんないなw
写真の日付だけ変えたみたいになっている

イメージ 9
雑草の伸び方でビニールの中は外より暖かかったんだろうなあってのがわかる

イメージ 14
コバエみたいなのも50匹くらいいた

イメージ 10
にんにくにとってはどうなんだろう

一昨年と比べて見る
これは一昨年の同じ時期のにんにく、ビニールは無しでの栽培
こうしてみると今回のは悪くない感じだなあ、むしろ植え付け時の悪条件を考えると今回のほうがいいくらい
ってことは暖かくした方が良さそう

追肥
イメージ 11
イメージ 12
いつもの化成肥料で追肥した

イメージ 13
水も1リットル入れた
追肥も水も植えたとき以来初めて


植えたのは約40個
今日生えているのを数えたら29本あった
あんな状態からよく発芽したなあと感心する




いちご

12月
イメージ 15
左は初夏に植えたもの、少し葉っぱの色が黄色くなってきた
中と右は秋に植えたもの

イメージ 16
アブラムシは相変わらずいっぱい居る

イメージ 17
親株

イメージ 18
正月
ずいぶん紅葉が進んだ

イメージ 20
アブラムシって寒さに強いんだなあ

今日
イメージ 19
イメージ 23
イメージ 24
枯れ葉が増えて、秋植えの方も葉っぱが黄色くなってきた
葉っぱが減ってきて作業しやすいから黒マルチをした方がいいんだけど
めんどくさいなあ( ´∀`)

イメージ 21
寒くなったらアブラムシは居なくなるだろうと思っていたけど
間違いだった

平均気温と最低気温の推移
イメージ 22
この程度の寒さはアブラムシには効かない

気温データは
気象庁 Japan Meteorological Agency
http://www.jma.go.jp/jma/index.html
より引用


関連記事
ベランダ菜園、1年半前に収穫したにんにくを植えた結果 ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14593610.html

ベランダ菜園いちご、7月から11月までのまとめ ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14587779.html

一昨年
にんにく放置栽培12月中旬から2015/02/12までのまとめ ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/12713195.html






ボタンの名前からコントロールIDを探すマクロ、IDを使ってセルの右クリックメニューに既存のボタン追加

$
0
0

セルの右クリックメニューに既存のボタン追加
イメージ 1
よく使う機能(ボタン)を追加した
値の貼り付け、書式の貼り付け、行列を入れ替えて貼り付け、図をファイルから挿入


エクセル2007専用
Sub ボタン追加するマクロ()
    Dim bName As String:    bName = "形式を選択して"
    Dim ind As Long
    Dim c As CommandBarControl

    For Each c In Application.CommandBars("Cell").Controls
        If Left(c.Caption, Len(bName)) = bName Then
            ind = c.Index
            Exit For
        End If
    Next
    
    '行列を入れ替える
    Application.CommandBars("Cell").Controls.Add id:=5838, before:=ind
    '書式の貼り付け
    Application.CommandBars("Cell").Controls.Add id:=369, before:=ind
    '値の貼り付け
    Application.CommandBars("Cell").Controls.Add id:=370, before:=ind
    '図をファイルから挿入
    Set c = Application.CommandBars("Cell").Controls.Add(id:=2619)
    c.Caption = "図をファイルから挿入"
End Sub

イメージ 3


追加するボタンの位置を決める
イメージ 4
形式を選択して~の上(前)に追加したいので形式を選択して~のIndexを取得する必要がある
この処理が2~11行目
単純に名前の文字列で検索している、結果は見た目通り4番めだった

14行目
行列を入れ替えるボタンをIDで指定して4番目に追加
イメージ 5
形式を選択して~は5番目になる

16行目で書式の貼り付けを4番目に追加
イメージ 6
形式を選択して~、行列を入れ替えるは1つづつ下がっていく

18行目で値の貼り付けボタンを4番目に追加
イメージ 7
これで貼り付け関連の3つのボタンはOK!

20行目
最後の図をファイルから挿入ボタンはボタンの名前を書き換えるために変数に入れている
ボタンを追加する場所は一番下、これはBeforeプロパティを指定しなければいい
21行目でボタンの名前を書き換えている
そのままの名前だと
イメージ 8
ファイルからってなっていてわかりづらい




「行列を入れ替える」より「行列を入れ替えて貼り付け」のほうがいいなあ

    '行列を入れ替える
    Application.CommandBars("Cell").Controls.Add id:=5838, before:=ind

13,14行目の↑これを↓に書き換える

    '行列を入れ替える
    Set c = Application.CommandBars("Cell").Controls.Add(id:=5838, before:=ind)
    c.Caption = "行列を入れ替えて貼り付け"



イメージ 9
できた


IDさえわかれば…
ボタンを追加するにはボタンのコントロールIDってのが必要
値の貼り付けのボタンなら370とかって決められている番号で、エクセルのバージョンによって同じボタンでも番号が違うらしい
ググったんだけど「書式の貼り付け」のIDが見つからない!もしかしてボタン自体がないのかと思ったけど
イメージ 10
エクセルのオプション→ユーザー設定→コマンドの選択ですべてのコマンド
これで探したらあるじゃない!でもポップアップをよく見たらリボンにないコマンドってある、リボンから外されているからないのかも?
でもどうしてもIDが知りたい!右クリックメニューに登録したい!

ボタンの名前からIDを探すマクロ

Sub コマンドボタンID探索()
    Dim cbName As String
    cbName = "書式の貼り付け" '←探したいコマンドの名前を入れる
    'コマンドの名前はエクセルのオプション→ユーザー設定→
    'コマンドの選択→すべてのコマンドで表示された一覧から探す
    'CommandBarの中のCommandBarControlの中のCommandBarControlまで探索する
    Dim strLen As Long
    strLen = Len(cbName)
    Dim isFind As Boolean:  isFind = False
    Dim ccCount As Long
    
    On Error Resume Next
    Dim str As String
    Dim c As CommandBar
    Dim cc As CommandBarControl
    Dim ccc As CommandBarControl
    '一度に探索するとエクセル自体が落ちるので50づつくらいにした方がいい
    'For j = 1 To 50
    'For j = 51 To 100
    'For j = 101 To 150
    'For j = 151 To 200
    For j = 1 To Application.CommandBars.Count '179
        Set c = Application.CommandBars.Item(j)
        For i = 1 To c.Controls.Count
            Set cc = c.Controls.Item(i)
            ccCount = cc.Controls.Count
            If ccCount = 0 Then GoTo ccErr
            For k = 1 To ccCount
                Set ccc = cc.Controls.Item(k)
                If Left(ccc.Caption, strLen) = cbName Then
                    str = "CommandBar.Index = " & c.Index & " : " & c.NameLocal & vbNewLine
                    str = str & "CommandBarControl.Index = " & cc.Index & " : " & cc.Caption & vbNewLine
                    str = str & "CommandBarControl.Index = " & ccc.Index & " : " & ccc.Caption & vbNewLine
                    str = str & "ID = " & ccc.id
                    MsgBox str
                    isFind = True
                End If
            Next
            If Left(cc.Caption, strLen) = cbName Then
                str = "CommandBar.Index = " & c.Index & " : " & c.NameLocal & vbNewLine
                str = str & "CommandBarControl.Index = " & cc.Index & " : " & cc.Caption & vbNewLine
                str = str & "ID = " & cc.id
                MsgBox str
                isFind = True
            End If
ccErr:
        Next
    Next
    If isFind = False Then
        MsgBox cbName & " は見つかりませんでした"
    End If
End Sub
探索する範囲(深さ)は
CommandBar
└CommandBarControl
└CommandBarControl
2段階までなので、これ以上深いところにあるボタンは見つけられない


3行目の
    cbName = "書式の貼り付け" '←探したいコマンドの名前を入れる
ここにボタンの名前を入れて実行

「書式の貼り付け」で検索した結果
イメージ 11
IDが369ってのがわかった!
IDの上の3行は見つかったボタンの場所でこの場合は
コマンドバーの170番目のコマンド追加って名前の中の
コマンドバーコントロールの2番めの編集って名前の中の
コマンドバーコントロールの9番目ってこと
IDさえわかればいいなら必要ないね

ボタンが見つからなかった場合も
イメージ 13
メッセージを出すようにしているけど
これが必要じゃなく、ボタンの場所表示も要らなければコードは短くなって↓

Sub コマンドボタンID探索()
    Dim cbName As String
    cbName = "書式の貼り付け" '←探したいコマンドの名前を入れる
    'コマンドの名前はエクセルのオプション→ユーザー設定→
    'コマンドの選択→すべてのコマンドで表示された一覧から探す
    'CommandBarの中のCommandBarControlの中のCommandBarControlまで探索する
    Dim strLen As Long
    strLen = Len(cbName)
    Dim ccCount As Long
    
    On Error Resume Next
    Dim str As String
    Dim c As CommandBar
    Dim cc As CommandBarControl
    Dim ccc As CommandBarControl
    '一度に探索するとエクセル自体が落ちるので50づつくらいにした方がいい
    'For j = 1 To 50
    'For j = 51 To 100
    'For j = 101 To 150
    'For j = 151 To 200
    For j = 1 To Application.CommandBars.Count '179
        Set c = Application.CommandBars.Item(j)
        For i = 1 To c.Controls.Count
            Set cc = c.Controls.Item(i)
            ccCount = cc.Controls.Count
            If ccCount = 0 Then GoTo ccErr
            For k = 1 To ccCount
                Set ccc = cc.Controls.Item(k)
                If Left(ccc.Caption, strLen) = cbName Then
                    str = str & "ID = " & ccc.id
                    MsgBox str
                End If
            Next
            If Left(cc.Caption, strLen) = cbName Then
                str = str & "ID = " & cc.id
                MsgBox str
            End If
ccErr:
        Next
    Next
End Sub

イメージ 12
これであっていると思うんだけどなぜかエラーでエクセル自体が終了してしまうことがある
今の環境でCommandBarの種類は179あって、これを一度に探索すると高確率でエラー、50個づつに分けて探索したら確率がかなり減った、でも0じゃないんだよなあ。
ボタンの名前は左から検索するので例えば "書式の" で探した場合は "書式の" で始まるボタンすべてが対象になって、見つかった数だけメッセージが出ることになる

これでボタンの名前さえわかればIDを取得することができるようになって、書式の貼り付けボタンを登録することができたけど、長かったなあ



右クリックメニューに登録した結果
いままでは値の貼り付けや行列を入れ替えて貼り付けは
イメージ 2
この画面で小さなラジオボタンをクリックしたり合計4回もクリックしていたけど
2回のクリックで済むようになった、マウスの移動距離も短い!





午後ツールその55、選択セル範囲を図形のテキストボックスにする、印刷用の点線を消すマクロを追加

$
0
0



この前作っていた選択セル範囲をテキストボックスにするマクロをアドインに取り入れてみた
イメージ 2
ついでに図形の選択と印刷の点線を消すマクロも加えた
ExTextBoxタブのtest1から6までがテキストボックス作成のボタン


選択セル範囲からテキストボックスを作る6つのボタン
イメージ 1
違いはテキストボックスの
  • 余白を初期値にするか元のセルに合わせるか
  • 行間隔を初期値にするか元のセルに合わせるか
  • サイズ自動調節の有無(サイズをテキストに合わせるかどうか)
この3つとセル幅を自動調整してから作成するかしないかの違い

test1、適度な余白と行間隔で見やすい
余白と行間隔は初期値、サイズ自動調整あり

test2、少し窮屈かも
余白は初期値、行間隔は元のセル、サイズ自動調整あり

test3、元のセルそっくりにする
余白なし、行間隔は元のセル+テキストボックスの大きさを元のセルの大きさにする(サイズ自動調整なし)

test4から6は↑3つそれぞれのセル幅を自動調整版


行間隔の対応の違い
イメージ 10
test1ボタンは元のセルの高さを無視する


仕様
イメージ 3

文字装飾は1文字ごとに対応
プロパティの位置関係セルに合わせて移動するけどサイズ変更しない
文字全体の位置左寄せ+上寄せ
枠の太さ0.75
背景色
枠色灰色
ObjectThemeColor= msoThemeColorLight1
TintAndShade = -0.5


文字の垂直位置は無視される
イメージ 11
セルの高さって調節することないからすっかり忘れてた、できるなら対応しようかなあと思ってちょっと調べたけどわからなかったので、これも仕様


実はテキストボックスではない
テキストボックスって言っているけど正確には図形の四角形の正方形/長方形の見た目をテキストボックスに仕立て上げたもの
なのでTypeはmsoTextBoxではなくてmsoAutoShapeになって動作が少し違う
この辺の詳しい経緯は
選択セル範囲を図形のテキストボックスにするマクロその3、図形の四角形をテキストボックス化 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14701540.html




図形の選択ボタン
イメージ 4
選択セルの上にある図形をすべて選択状態にするので
この状態でボタンを押すと

イメージ 5
こうなる

このマクロは
その32、タイトルつきテキストボックスをアドインの午後のパレットに追加した、外枠も ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/13154302.html
この時のもので、今回はこれをアドインのボタンに登録しただけ
これもう2年前になるんだなあ…



印刷の点線を消すボタン
イメージ 6
印刷用の点線が表示されているときにボタンを押すと

イメージ 7
はい、消えた

普通なら印刷のプレビューとか印刷関連の設定をしたときに表示されるものだけど、
マクロのテストしているときに重たいものを実行すると稀にこの印刷用の点線が表示されることがあって、一回表示されるとエクセルを終了するまで消えない、消し方がわからなくて、ずいぶん昔に書いたマクロを登録したもの

'印刷のページ区切りの点線をアクティブブックのすべてのシートで非表示
Public Sub HidePageBreaks()
    Application.ScreenUpdating = False
    Dim c As Long
    For c = 1 To ActiveWorkbook.Sheets.Count
        ActiveWorkbook.Sheets(c).DisplayPageBreaks = False
    Next c
    Application.ScreenUpdating = True
End Sub
確かエクセル2000のころから点線が表示されることがあったから、その頃に書いたと言うよりググって見つかったものをコピペしたのかも( ´∀`)


マクロじゃなくて手動の場合
イメージ 8
エクセルのオプション→詳細設定にある
改ページを表示するのチェックを外せば消えるみたいだけどこれだとシートごとの設定になるみたいねえ


GIFアニメーションで
イメージ 9
基本はtest1ボタンかなあ、セル幅が調節されていないときはtest4ボタン
あとはセル範囲と同じ大きさにしたいときにtest3ボタン


アドインダウンロード



関連記事
午後ツールその54、ウィンドウ枠の固定を引き継いで新しいウィンドウを開く ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14667685.html


選択セル範囲を図形のテキストボックスにするマクロその5、テキストボックスの余白と行間隔 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14707271.html






図形のテキストボックスの段落のタブの配置をVBAで正確に取得できないことがあったので調べてみた

$
0
0


図形やテキストボックスの中の文字列をセルにコピーするマクロ

'選択状態の図形の文字列を近くのセルへコピー
'複数行なら複数セルを使用
Sub ShapeTextToCell()
    Dim i As Integer
    Dim str As String
    
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1) '選択図形取得
    Dim pRange As Range '貼り付け先のセル
    Set pRange = s.topLeftCell  '図形の左上にあるセル
    Dim tr As TextRange2
    Set tr = s.TextFrame2.TextRange '図形のテキスト全体(textRange)を取得
    '1行ごとにセルに文字を入力
    For i = 1 To tr.Paragraphs.Count
        str = tr.Paragraphs.Item(i).text '図形から文字列取得
        str = Replace(str, vbLf, "") '改行を削除
'        str = Replace(str, vbNewLine, "") 'これだと改行が削除されない
        pRange.Cells(i, 1).Value = str 'セルに入力
    Next
End Sub


イメージ 1
文字のある図形を選択した状態でマクロを実行すると

イメージ 2
図形の中の文字列が図形の左上のセルにコピーされる

イメージ 3
文字列に改行がある複数行の場合はコピー先も複数行になる



やっぱり可逆だよね
複数行のセルの値をまとめて1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14674215.html
今回のマクロはここから始まったセルの値をテキストボックスにするマクロの逆
一方通行より双方向

目的は
午後ツールその55、選択セル範囲を図形のテキストボックスにする、印刷用の点線を消すマクロを追加 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14715274.html
このアドインで作成したテキストボックスの文字列をセルに戻せるようにすること




蛇足だけど複数列から作った文字列の場合
'選択状態の図形の文字列を近くのセルへコピー
'複数行複数列、TableTextBoxtestで作成したテキストボックス用
Sub ShapeTextToCell5()
    Dim i As Long, j As Long
    Dim str As String
    
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim pRange As Range '貼り付け先
    Set pRange = s.topLeftCell  '図形の左上にあるセル
    
    Dim tr As TextRange2
    Set tr = s.TextFrame2.TextRange '図形のテキスト全体(textRange)を取得
    Dim ptr As TextRange2
    Dim ptrFont As Font2
    Dim tRange As Range
    Dim v() As String
    '行ごと
    For i = 1 To tr.Paragraphs.Count
        Set ptr = tr.Paragraphs.Item(i)
        str = ptr.text
        str = Replace(str, vbLf, "") '改行削除
        '先頭のタブ文字削除
        If Left(str, 1) = vbTab Then
            str = Right(str, Len(str) - 1)
        End If
        v = Split(str, vbTab) 'タブ文字で区切って配列に入れる
        '1セルごと、1行の左から右へ1セルごと
        For j = 0 To UBound(v)
            Set tRange = pRange.Cells(i, j + 1)
            tRange.Value = v(j)
        Next
    Next
End Sub

イメージ 4
テキストボックスの文字列にはタブ文字(vbTab)を入れて元のセル間隔を再現しているので、Split関数でタブ文字で区切ればセルごとの文字列になる
        v = Split(str, vbTab) 'タブ文字で区切って配列に入れる
あとは先頭にあるタブ文字は要らないので削除、これでOK




ここからが本当の地獄だヽ(・ω・)/

図形のテキストボックスの段落のタブの配置をVBAで正確に取得できないことがあったので調べてみた
イメージ 5
日付って入れたセルだけ中央揃えにしたものから作ったテキストボックス、1行目(段落)を見ると

イメージ 6
1個めのタブの配置は中央、2個めのタブの配置は左に設定されている
セルにコピーするときに反映するにはこの配置の値を取得する必要がある
この値は図形の1行目の1個めの場合は
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(1).Type
これで取得できる
けど状況によっては正しく取得できなくなることがある
僕の書き方が良くないのかもしれないけど、よくわからん
対処法としての結論が
正しい値を取得するには上のように図形から直接するか
変数に入れるときは
図形.TextFrame2、
図形.TextFrame2.TextRange
ここまでにする、例えば図形.TextFrame2.TextRangeから
    Dim tr As TextRange2
    Set tr = 図形.TextFrame2.TextRange
    Set ts01 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(1)
    Set ts02 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(2)
    type01 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(1).Type
    type02 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(2).Type
これならOK



正しい値が取得できないのはもっと深いところを変数に入れてそこから取得する時
図形.TextFrame2.TextRange.Paragraphs.Item(1)
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops
これを変数に入れてそこから取得するとおかしくなる



ここから経緯

Sub testtabs5()
    Dim s As Shape
    Set s = Selection.ShapeRange.Item(1)
    Dim ts01 As TabStop2, ts02 As TabStop2
    Dim type01 As MsoTabStopType, type02 As MsoTabStopType
    
    Dim pf As ParagraphFormat2
    Set pf = s.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat
    Set ts01 = pf.TabStops.Item(1)
    Set ts02 = pf.TabStops.Item(2)
    type01 = pf.TabStops.Item(1).Type
    type02 = pf.TabStops.Item(2).Type        
End Sub

イメージ 7

イメージ 8
このマクロは選択図形の文字列の1行目の1個めと2個めのタブとその配置を取得するもの
配置はそれぞれtype01とtype02に取得する
期待する結果は
type01 = msoTabStopCenter'中央
type02 = msoTabStopLeft'左
なんだけど…
イメージ 9
type01 = msoTabStopCenter'中央
type02 = msoTabStopCenter'中央
と、2個めの配置が正しく取得できていない、なんで?

イメージ 12
取得したタブの中を見ても正しい値にはなっていない



次にタブの取得をする9,10行目をコメントアウトして
イメージ 10
これを実行

イメージ 11
type01 = msoTabStopCenter'中央
type02 = msoTabStopLeft'左
正確に取得できる
タブを取得した時点でおかしくなるみたい…
⊂( ・∀・)ワケ ( ・∀・)つワカ ⊂( ・∀・)つラン♪


それでも一番上から直接取得するようにして
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(2).Type
ってすると
イメージ 13
正確に取得できるので
ParagraphFormatを変数に入れて
その変数からタブを取得するとおかしくなる?


ParagraphFormatの上のParagraphから取得してみる
イメージ 14
これでも間違っている


もう1個上のTextRangeから取得してみる
イメージ 15
正確に取得できた!


これでなんとかなるかなあ
イメージ 16
もっと簡単にできるかと思っていたけど思わぬ落とし穴?があった
次は文字の装飾




午後ツールその56、図形の中の文字列をセルにコピーする

$
0
0



前々回のボタンアイコンを変更、ボタン1個追加
イメージ 1
アイコンを変更しただけで機能は同じで
選択セル範囲をテキストボックスにする



追加したボタン
イメージ 2
追加したボタンは前回に載せた
テキストボックスの文字列をセルにコピーするマクロを実行するボタン


イメージ 3
図形を選択した状態でボタンを押すと…

イメージ 4
あれ?
セルにコピーしたんだけど白文字だから見えてないわ

イメージ 5
黒字にしたところ
コピーされていたのがわかった
こんなふうに図形の中の文字列をコピーする
これだけだったら普通にコピペしたのと変わらないから
アドインにする必要ないじゃない

本来の使いみち
イメージ 6
セルの値からテキストボックスを作成するボタンで作ったテキストボックスから、またセルに戻したいときに使うのに作ったなので…

イメージ 8
このセル範囲からテキストボックスを作って

イメージ 7
ここでセルにコピーするボタンで

イメージ 9
見た目だけは元通り


ワードアートをコピー
イメージ 13
セルの文字装飾の限界を超えるような、ワードアートなどの凝った文字装飾はコピーできない
セルでできるだけ再現




コピー(貼り付け)先に値か数式があればメッセージ表示
イメージ 10
貼り付け先は選択図形の左上の角の下にあるセルが基準になる
複数行なら下方向のセルに貼り付け
タブ区切りなら右方向のセルに貼り付け
上の図形だと2行、4列ぶんになる
貼り付け先になるセル範囲は
基準はB5セルから2行、4列なので
B5:E6
このセル範囲には値が入っているのでコピーしようとすると


イメージ 11
メッセージ表示



うーん、これでテキストボックス系の基礎的なところはできたかなあ、次は
イメージ 12
この見出し付きのテキストボックスを作るアドインが中途半端になっているから、これをなんとかしたいねえ、名前からしてボタンはテキストボックスなのに出てくるウィンドウのタイトルは午後のツールとかで違っているし、そもそも午後ツールと重複している


ヤフーボックスからアドインダウンロード

関連記事
図形の中の文字列をセルにコピーするマクロ
図形のテキストボックスの段落のタブの配置をVBAで正確に取得できないことがあったので調べてみた ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14718810.html


午後ツールその55、選択セル範囲を図形のテキストボックスにする、印刷用の点線を消すマクロを追加 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14715274.html



ベランダ菜園、イチゴに追肥と黒マルチ、にんにくの様子

$
0
0

イチゴの様子
イメージ 1
イメージ 2
今日はマルチングしやすい条件が揃った
  • 晴れ
  • 風がいつもより穏やか【重要】
  • 気分
  • いちごは今くらいの季節が1番寒くて葉っぱが少ない



イメージ 3
イメージ 4
枯れ葉や雑草を取り除いて


イメージ 5
いつもの化成肥料で追肥、4つのプランターでこれだけ、量は雰囲気
ようりんも使えばよかったと気づいたのは
この記事を書き終わる頃だった

イメージ 6
1つだけ花らしきものがついていた
寒いときに花芽が出てくるのは肥料不足ってのをどこかで読んだ

アブラムシ
イメージ 17
だいぶ減ったけど居る

穴あけ
イメージ 7
穴の開け方は一直線にしてみた
○や✛はめんどくさい

イメージ 8
葉っぱをくぐらせたところ
これでいいんじゃないかな

イメージ 11
イメージ 12
イメージ 13
1時間くらいかけて完成

イメージ 9
全部で22株かな

イメージ 10
親株は廃棄予定だからマルチはスゴイ雑、申し訳程度のマルチング要素

一昨年(2015年)の黒マルチ
やっぱり同じ時期にしていた
去年は放置していたからこの一昨年のままだった
そのせいかほとんど収穫できなかったんだよなあ



にんにく
イメージ 14
この前追肥したんだけどあんまり変わんないかなあ

イメージ 15
古い葉っぱが黄色くなるのが目立つ

イメージ 16
蒸れるのは良くないかなと少し隙間を開けるようにしてみた



前回
にんにくとイチゴのベランダ菜園、2016年12月中旬から今日までの様子 ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14709023.html


一昨年の
いちごのプランターに黒マルチ張ってみた、ようりんを使ってみた ( ガーデニング ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/12735502.html



午後ツールその57、見出し付きテキストボックス作成アドインりらいと

$
0
0

午後ツールはネ申エクセル作成を助長するものではありません\(^o^)/

午後ツールに新しい仲間が増えました
午後のTextBox
イメージ 1
選択セル範囲からテキストボックスを作成するアドイン
この前と違うのは
見出し(タイトル)付きテキストボックスを作成する

以前にも同じのを作っていたんだけど、イマイチ使いづらかったのと中のコード的に今ならもっとうまく書ける(処理できる)はずだってことで作り直した
イメージ 2
昔作った方、ラジオボタン多すぎ



列ごとに作成
イメージ 3
それぞれのボタンの結果


行ごと
イメージ 4



見出し付きテキストボックスは
2つのテキストボックスをグループ化しただけ
イメージ 6
単純にグループ化しただけなので
形が崩れてしまうことがよくある
そんなときに使うのが
再整形ボタン
イメージ 7
だいたいいい感じになるはず


最寄りのセルへ移動ボタン
イメージ 5
選択図形の左上から一番近いセルに移動して
左上に合わせる
流れとして上のセルに合わせたら下のセルにも合わせたくなる
そこで
高さをセルに合わせるボタン
イメージ 8
図形の高さを変更(伸ば)してセルピッタリにする

ボタンの中の処理内容
イメージ 9
高さをセルに合わせるのが1番処理数が多くて
再整形と同じ処理もしているので形が崩れてしまったときも有効




セル幅のラベル作成
イメージ 10
選択セルの数分だけ作成する
中央揃えで背景色ランダム白文字のテキストボックス
セル幅より文字数が多ければセル幅以上になる

イメージ 11
セルの高さに合わせたところ




よ~しできたーって動かしながらこの記事を書いてたんだけど、エラーになったり期待しない動きをしたりで修正していたら使わないボタンもでてきて
イメージ 12
少しスッキリした
ボタンにはアイコンを表示してみたけど
変な縮小表示みたいになって画像の周囲1ピクセルが表示されないんだよねえ
Imageコントロールなら正常に表示されるので
Imageの上に透明なボタンを置く事になりそう



午後ツールダウンロード



前回の午後ツール
午後ツールその56、図形の中の文字列をセルにコピーする ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14720818.html






午後ツールその58、見出し付きテキストボックスの色変更

$
0
0


昨日からの続き
イメージ 1
見出し付きテキストボックスの色を変更するボタンを追加した


図形選択は前のと一緒で選択セルの上にある図形をすべて選択状態にする
イメージ 2




枠色を見出しの色にすると灰色に戻す
イメージ 3
枠の色を変える



色の取得
イメージ 4
選択した図形やセルから取得できる



取得した色にする
イメージ 5
見出し図形の色だけ変更するので普通の図形や本文の図形はそのまま



ランダム色変更1
イメージ 6
選択した見出し図形の色を変更する
押すたびに色が変更される


ランダム色変更2
イメージ 7
これは図形ごとにランダムな色になる




イメージ 8
たーのしー!



午後ツールダウンロード



関連記事
午後ツールその57、見出し付きテキストボックス作成アドインりらいと ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14731600.html








Viewing all 420 articles
Browse latest View live