タグ:Excel ( 7 ) タグの人気記事
[Excel] 文字入力のみで自動色分けするスケジュールフォーマットを作成する
こんにチワワ。どーもボキです。

Excelブックを共有設定した場合、複数ユーザからセルへの文字入力は可能なものの、
図形(オートシェイプ)編集はできなくなる。

そのため、図形を使わず、セルへの文字入力のみスケジュールを作成する方法を紹介する。
またこの方法ならば、図形を使うよりも、日程の延長/短縮や色分けの編集も簡単に行える。
a0021757_21331285.gif
スケジュールのイメージ(■や★の記入のみで色分けされる)


以下を利用し実現する。
 ・ワークシート関数
 ・記号文字(■、●、★など)
 ・条件付き書式 機能

a0021757_14315029.gif
左列を参照する数式を入力する。(参照先がブランクの場合、参照元セルが「0」を表示)

a0021757_14314312.gif
参照先セルに「=""」を入力すれば、参照元セルもブランク表示となる。

a0021757_14313589.gif
■や★を入力し、スケジュールを書く。★の右列(P2)には、「=""」を入力)

a0021757_14312929.gif
条件付き書式を設定し、■であり、=左列ならば、フォント(文字)とパターン(塗りつぶし)に同じ色を指定する。

a0021757_14312376.gif
同様に、「■であり、≠左列」と「★である」条件での書式を追加する。

a0021757_14311899.gif
文字入力のみで、該当箇所が塗りつぶされるスケジュールフォーマットが完成。


Excel2003の場合、条件付き書式は3つまでに対し、2007以降は無制限となっている。

そのため、条件付き書式を使い「=0」の場合は、フォントの色を白にするとしておけば、
参照先が「0」と表示されても見えないので問題ない。(「=""」の入力が不要)

また、より多くの記号を使い、細かなスケジュールを作成することができる。


[PR]
by yozda | 2016-05-14 14:49 | プログラミング | Trackback | Comments(0)
[Excel] メモ帳を使ってマクロをデバッグする。
こんにチワワ。どーもボキです。
12連休です。

Excelマクロのデバッグをちょっと楽にするデバッグ用関数WriteNote
引数で渡した文字列をメモ帳に出力するよ。
Dim hNotePad, hNotepadEditClass As Long

' Windows API
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long

Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, _
ByVal lpszWindow As String _
) As Long

Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As String _
) As Long

Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) As Long

Declare Function SetWindowPos Lib "user32.dll" ( _
ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) As Long

Declare Function SetWindowText Lib "user32.dll" Alias "SetWindowTextA" ( _
ByVal hWnd As Long, _
ByVal lpString As String _
) As Long

' メモ帳に文字列を出力
Public Sub WriteNote(s As String)
Const EM_REPLACESEL As Long = &HC2
Const EM_SETMODIFY As Long = &HB9
Const WM_NULL As Long = &H0
Const ES_AUTOVSCROLL As Long = &H40
Const HWND_TOPMOST As Long = -1
Const SWP_NOSIZE As Long = 1
Const SWP_NOMOVE As Long = 2
Const SWP_NOACTIVATE As Long = &H10

hNotePad = FindWindow("Notepad", vbNullString)
If hNotePad = 0 Then
' メモ帳がない⇒起動
Shell "Notepad.exe", vbNormalFocus
Do While hNotePad = 0
hNotePad = FindWindow("Notepad", vbNullString)
DoEvents
Loop

Call SendMessage(hNotePad, WM_NULL Or ES_AUTOVSCROLL, 0, 0) ' 自動スクロール
Call SetWindowText(hNotePad, ThisWorkbook.Name) ' メモ帳キャプション変更
Call SetWindowPos(hNotePad, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOACTIVATE) ' 最前面

hNotepadEditClass = FindWindowEx(hNotePad, 0, "Edit", vbNullString)
End If

Call SendMessage(hNotepadEditClass, EM_REPLACESEL, 0, s & vbCrLf) ' 文字列を送信
Call SendMessage(hNotepadEditClass, EM_SETMODIFY, 0, 0) ' 変更フラグOFF
End Sub


'Private Sub Workbook_BeforeClose(Cancel As Boolean)
' Const WM_QUIT = &H12
' Call PostMessage(hNotePad, WM_QUIT, 0, 0)
'End Sub

' 終了時にメモ帳を閉じる
Private Sub Auto_Close()
Const WM_QUIT = &H12
Call PostMessage(hNotePad, WM_QUIT, 0, 0)
End Sub




[PR]
by yozda | 2015-04-25 20:03 | プログラミング | Trackback(1) | Comments(0)
[Excel] OutputDebugStringを使ってマクロをデバッグする。
こんばんワイン。どーもボキです。

APIのOutputDebugStringをラッパーした関数dprintf
出力メッセージを拾うには、DebugViewが必要。
Declare Sub OutputDebugString Lib "kernel32.dll" Alias "OutputDebugStringA" (ByVal lpOutputString As String)

Sub dprintf(v)
Dim i, s, ityp

s = v
ityp = VarType(v)
If ityp = vbBoolean Then
s = CStr(v)
ElseIf VarType(v) >= vbArray Then
s = ""
For i = 0 To UBound(v)
s = s & "dprintf(" & CInt(i) & ") =" & v(i) & vbCrLf
Next
End If
OutputDebugString (s)
End Sub
[Excel] メモ帳を使ってマクロをデバッグする。

[PR]
by yozda | 2015-04-25 19:57 | プログラミング | Trackback | Comments(0)
[VBScript] 指定時間経過後にPCをスタンバイにする
こんばんワイン。どーもボキです。

PCをスタンバイにするで紹介したもの使った。
Excel未インストールの場合には、SendKeyを利用するようにしている。

何かしらの処理(○○な動画ダウンロード・変換など)で一定時間後にPCを切りたいときなどに利用できそう。
a0021757_23433621.gif
s = InputBox("hh:mm形式","指定時間後にスタンバイ","00:10")
If s = "" Then WScript.Quit

t = CDate(s) + Time
While CDate(t) > Time
WScript.Sleep(10000)
Wend

Set objWS = CreateObject("WScript.Shell")
r = objWS.PopUp("スタンバイにします。",3,"確認",vbOKCancel)
If r = vbCancel then WScript.Quit

On Error Resume Next ' Excel未インストール対応
Set objExcel = CreateObject("Excel.Application")
On Error GoTo 0
If Not (objExcel Is Nothing) Then
' Excelあり
cmd = "CALL(""powrprof.dll"",""SetSuspendState"",""JJJJ"",0,0,0)" '1,0,0とすると休止
objExcel.ExecuteExcel4Macro(cmd)
objExcel.Quit ' Quitしないとプロセスが残るため
Else
' Excelなし ⇒ タスクマネージャーを起動
objWS.SendKeys "^+{esc}" ' タスクマネージャー起動
Do While Not objWS.AppActivate("Windows タスク マネージャ")
WScript.Sleep 250 ' タスクマネージャー起動待ち
Loop
WScript.Sleep 1000

' ショートカットキーを送信
objWS.SendKeys "%ub%fx" ' スタンバイ
'objWS.SendKeys "%uh%fx" ' 休止状態
'objWS.SendKeys "%uu%fx" ' シャットダウン
'objWS.SendKeys "%ur%fx" ' 再始動
'objWS.SendKeys "%ul%fx" ' ログオフ
End If

[VBScript] Craving Explorerの動画変換の終了後、PCをスタンバイにする

[PR]
by yozda | 2014-11-22 23:46 | プログラミング | Trackback | Comments(0)
[Excel] コピーした文字列を改行ごとにテキストボックス化して張り付ける
『やっぱ今年はやめとくか?』 と言われそう。どーもボキです。

コピーした文字列を、選択セル位置を基準に一行ごとにテキストボックス化して貼り付けるマクロ。

ひとつのテキストボックスや行ごとに 箇条書きで書き溜めたアイデアを、
グループ分けしたり、前後関係で並べてみたり、そんなのに使えそう。

というかそのために作ったんだが、そもそも考えがまとまらないこととは関係なかったわ。
a0021757_1315010.gif
以下Excelマクロのソース。
Sub ClipBoardToTextBox()
' クリップボードの文字列を取得
s = CreateObject("htmlfile").parentwindow.clipboarddata.GetData("text")
If s = "" Then Exit Sub

' 表示更新を停止
Application.ScreenUpdating = False

' アクティブセルの座標を取得
x = ActiveCell.Left
y = ActiveCell.Top

' 改行ごとに格納
slst = Split(s, vbCrLf)

For i = 0 To UBound(slst): Do
If slst(i) = "" Then Exit Do

' テキストボックスを該当行に作成
ActiveSheet.Shapes.AddLabel(msoTextOrientationHorizontal, x, y, 0#, 0#).Select

' テキストボックスに文字を反映
Selection.Characters.Text = slst(i)

' テキストボックスの装飾
Selection.ShapeRange(1).TextFrame.AutoSize = msoTrue
Selection.ShapeRange.Line.Visible = msoTrue
' Selection.ShapeRange.Line.Style = msoLineThinThin ' 縁取り線「=」
' Selection.ShapeRange.Line.Weight = 3#
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
Selection.ShapeRange.Line.Visible = msoTrue
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 9
Selection.ShapeRange.Fill.Visible = msoTrue
Selection.ShapeRange.Fill.Solid

' テキストボックスの作成座標を更新
y = y + Selection.Height
Loop Until 1: Next

' 表示更新を再開
Application.ScreenUpdating = True
End Sub
ここの下のほうにあるDataObjectを使うやり方を試したんだが、
Microsoft Forms 2.0 Object Libraryを参照設定するために、ユーザフォームを追加したり面倒。
クリップボードから文字列の取得する方法もわからんかった(Formatなんとかってエラーが出る)のであきらめた。


[PR]
by yozda | 2012-11-04 13:19 | プログラミング | Trackback | Comments(0)
[Excel] グループとアウトライン設定 > グループ化 を大量に設定するときのコツ
どーもボキです。

a0021757_2044676.gif
この例では、1400個のグループを、
さらに80個のグループに分けている。

グループ表示の設定/解除(画像左上の[1]~[3]ボタン)を押すと、
Excelの再計算が走り、
左図のようにCPUが100%に貼り付く。

この処理は、
PenM1.5GHz 760MBRAMで、約3分かかる。

また30000万行までグループ処理を行ったが、
セルには値を入力していない。

この現象は、グループの設定/解除時にExcelの自動計算が実行されるためだ。
なので、自動計算を解除すれば解決できる。

設定ならば、
 ツール > オプション > ┌ 計算方法 ┐ > 計算方法 を 手動
に変更。

マクロならば、
Workbook オブジェクト.PrecisionAsDisplayed = False
で。
[PR]
by yozda | 2009-06-08 20:16 | プログラミング | Trackback | Comments(0)
[VBScript] VBSにファイルがドロップされたファイルのパスをExcelマクロに渡す
どーもボキです。

始めにいっとくけど、ボカぁはExcelのマクロは、ほとんど知らにゃい。
それに嫌い。
Helpの検索が酷くないか? 「For」を検索すると「一致する項目はありません」って何よ。探せ!つうの。
エディタもパッチを当てなきゃマウスホイールでスクロールすら出来ないし。 これは、ココを参考に解決した。

まぁいい。

Excelマクロを使い、さまざまなファイルを処理したい場合、
そのファイル名をどうやって取得しているだろうか?

a0021757_1365287.gifEXEファイルのように、ファイルをドロップし処理させたい。
だが、これはできない。(左図)
ファイル選択ダイアログ を表示し、処理したいファイルをユーザに選ばせる」 という手もある。
だが、「ユーザへの負担は極力へらす」 を開発ポリシーの一つとしているボキとしては、これはありえない。
だって面倒じゃん、フォルダを探ってファイルを選択するのってさ。

色々調べていくうち、
VBSを経由すれば、Excelマクロにドロップされたファイルパスを渡せることが分かった。
サンプルプログラム (Excel、VBS)

VBSのコード
' Excelファイル名 と マクロ名
FName = "ExcelMacro.xls"
Macro = "ShowMsgBox"

If WScript.Arguments.Count = 0 Then
WScript.Quit
End If

' VBSの保存パスの取得

Set objFS = WScript.CreateObject("Scripting.FileSystemObject")
DPath = objFS.GetParentFolderName(WScript.ScriptFullName) & "\"

' Excelファイルを開く
Set objXLS = CreateObject("Excel.Application")
objXLS.Workbooks.Open DPath & FName

' マクロを実行
For i = 0 To WScript.Arguments.count -1
objXLS.Run Macro, WScript.Arguments.Item(i)
Next

objXLS.Quit

Excelファイル「ExcelMacro.xls」に記述したマクロ
Sub ShowMsgBox(FPath As Variant)
MsgBox FPath
End Sub
VBS と Excel を同じフォルダに置き、VBSファイルにファイルをドロップすると、
以下のように、Excelマクロにドロップされたファイルのフルパスを渡っていることが確認出来る。
a0021757_1585617.gif

[PR]
by yozda | 2009-06-06 01:59 | プログラミング | Trackback | Comments(4)