VBA でセルの値をオートシェイプに表示させる
検索してもなかなか引っかからなかったのですが、以下のサイトで「DrawingObjects」というものを知りました。
このサイトを参考に、C1 セルの値を A1 セルにあるオートシェイプに表示させてみました。
Public Sub Macro1() Dim sheet As Worksheet Set sheet = ThisWorkbook.Worksheets(1) Dim sp As Shape For Each sp In sheet.Shapes If sp.TopLeftCell.Address(0, 0) = "A1" Then sp.DrawingObject.Formula = "=$C$1" End If Next sp Set sp = Nothing Set sheet = Nothing End Sub
これは便利だなぁ〜。
HHKB Lite2 + Windows 7 でロックできるようにしてみた
2011/07/06 3:50 追記
Windows キーを使用できるようにするツールが公開されていることをコメントで教えていただきました。
Happy Hacking Keyboard | HHKBキー配列切替ツール | PFU
以下のようなことをしなくてもロックできるようになりました!!!
以前から気になっていた HHKB Lite2 を購入しました。
PFU Happy Hacking Keyboard Lite2 日本語配列かな印字なし USBキーボード ブラック PD-KB220B/U
- 出版社/メーカー: PFU
- 発売日: 2004/06/17
- メディア: Personal Computers
- 購入: 6人 クリック: 127回
- この商品を含むブログ (28件) を見る
評判通りコンパクトで、タイプするのが心地良く、すぐ気に入ってしまいました。
ただひとつ、よく利用するショートカットキーの【Win】+【L】 のロックが使えない・・・。
HHKB の ページに書いてありますね。。。Windows 7 だとできないみたいです。
とにかく何とかショートカットキーでできないものかと調べてみました。
ロックする VBScript を書いて、それをショートカットキーで実行できるようにすればよいのではと思い、まずは VBScript を探してみることに。
以下のページに書いてありました。
Hey, Scripting Guy! スクリプトを使用してワークステーションをロックすることはできますか。
On Error Resume Next Set objShell = CreateObject("Wscript.Shell") objShell.Run "%windir%\System32\rundll32.exe user32.dll,LockWorkStation"
これを適当な名前で保存して(参照ページでは C:\Scripts\Lock_workstation.vbs として保存してます)、デスクトップにショートカットを作成します。
ファイルを右クリック->送る->デスクトップ(ショートカットを作成)
デスクトップ上のショートカットを右クリックしてプロパティを選択します。
ショートカットキーのところで割り当てたいキーを入力します。
(参照:ショートカット キーを作成してプログラムを開く)
「OK」ボタンをクリックすれば完了です。
これで【Ctrl】+【Alt】+【L】でロックできるようになりました!!!
タイムアウトしたアプリを閉じる方法
Option Explicit Private Declare Function OpenProcess Lib "kernel32.dll" ( _ ByVal dwAccess As Long, _ ByVal fInherit As Integer, _ ByVal hObject As Long _ ) As Long Private Declare Function WaitForSingleObject Lib "Kernel32" ( _ ByVal hHandle As Long, _ ByVal dwMilliseconds As Long _ ) As Long Private Declare Function TerminateProcess Lib "kernel32" ( _ ByVal hProcess As Long, _ ByVal uExitCode As Long _ ) As Long Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long _ ) As Long Const SYNCHRONIZE = 1048576 Const WAIT_TIMEOUT = 258 Const PROCESS_TERMINATE = &H1 Private Sub Main() Dim ProcessID As Long Dim ProcessHandle As Long Dim Ret As Long ProcessID = Shell("notepad.exe", vbNormalNoFocus) ProcessHandle = OpenProcess(SYNCHRONIZE, True, ProcessID) Ret = WaitForSingleObject(ProcessHandle, 5000) Call CloseHandle(ProcessHandle) ProcessHandle = OpenProcess(PROCESS_TERMINATE, True, ProcessID) Call TerminateProcess(ProcessHandle, 0&) Call CloseHandle(ProcessHandle) If Ret = WAIT_TIMEOUT Then Debug.Print "タイムアウト!" End Sub
OpenProcess の第1引数を変えて、ハンドルを開きなおす必要があるところでちょっと躓いたのでメモしておく。
フィールドサイズを変更する SQL がわからない
同じ名称のフィールドがいくつものテーブルにあるので、ひとつひとつサイズを変更していくのは、ちょっと大変。。。
なので、SQL で一発で何とかしたいなぁと思ったんだけど、どうすればいいのか。
もう少し調べてみる!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
できた><
-- 変数宣言 DECLARE @tbl_name VARCHAR(50) DECLARE @fld_name VARCHAR(50) -- フィールド名設定 SET @fld_name = 'hoge' -- ユーザー定義のテーブルを抽出 DECLARE cursor_name CURSOR FOR SELECT NAME FROM sysobjects WHERE xtype = 'U' ORDER BY NAME OPEN cursor_name FETCH NEXT FROM cursor_name INTO @tbl_name WHILE @@FETCH_STATUS = 0 BEGIN -- 指定フィールドが存在する場合 IF EXISTS( SELECT obj.name , col.name FROM syscolumns AS col INNER JOIN sysobjects AS obj ON col.id = obj.id WHERE obj.type = 'U' AND obj.name = @tbl_name AND col.name = @fld_name ) BEGIN -- プリント PRINT @tbl_name + N' の ' + @fld_name + N' のサイズを 2 から 3 に変更します。' -- 指定フィールドの型を varchar(3) に変更する。 EXEC ('ALTER TABLE ' + @tbl_name + ' ALTER COLUMN ' + @fld_name + ' varchar(3)') -- 列プロパティ(拡張プロパティ)の説明が空白の場合 IF (SELECT ISNULL( (SELECT ex.value FROM sys.extended_properties AS ex WHERE col.id = ex.major_id AND ex.minor_id = col.colid AND ex.name = 'MS_Description' ),'' ) FROM syscolumns AS col INNER JOIN sysobjects AS obj ON col.id = obj.id WHERE obj.name = @tbl_name AND col.name = @fld_name ) = '' BEGIN -- INSERT EXEC sys.sp_addextendedproperty @name = N'MS_Description' , @value = N'2009/01/20 サイズを 2 → 3 に変更' , @level0type=N'SCHEMA' , @level0name=N'dbo' , @level1type = N'TABLE' , @level1name = @tbl_name , @level2type = N'COLUMN' , @level2name = @fld_name; END ELSE BEGIN -- UPDATE EXEC sys.sp_updateextendedproperty @name = N'MS_Description' , @value = N'2009/01/20 サイズを 2 → 3 に変更' , @level0type=N'SCHEMA' , @level0name=N'dbo' , @level1type = N'TABLE' , @level1name = @tbl_name , @level2type = N'COLUMN' , @level2name = @fld_name; END END FETCH NEXT FROM cursor_name INTO @tbl_name END CLOSE cursor_name DEALLOCATE cursor_name
参考ページ
SQLの基本-テーブルの変更(ALTER TABLE):老プログラマーの備忘録:So-netブログ
SQL Server 拡張プロパティについて - アジャイルプログラマの日常
テーブル、列の備考情報を設定、取得する | VB.NETで作る!
カラムの存在チェック - SQL Server 締切済み| 【OKWAVE】
sp_addextendedproperty (TRANSACT-SQL) - SQL Server | Microsoft Docs
sp_updateextendedproperty (TRANSACT-SQL) - SQL Server | Microsoft Docs
今日の Twitter
今日は Twiiter で発言していません。