VBA でセルの値をオートシェイプに表示させる

検索してもなかなか引っかからなかったのですが、以下のサイトで「DrawingObjects」というものを知りました。

VBA研究室 Part 3


このサイトを参考に、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 Happy Hacking Keyboard Lite2 日本語配列かな印字なし USBキーボード ブラック PD-KB220B/U

評判通りコンパクトで、タイプするのが心地良く、すぐ気に入ってしまいました。


ただひとつ、よく利用するショートカットキーの【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

ログがうまくとれてない?

今、気が付いた。10月9日から Twitter のログがとれてないなぁ。。。
あとでしらべる。


それと、そろそろユーザタイムラインじゃなくて、
フレンドタイムラインのログがとれるようにしたいなぁ。