Hatena::ブログ(Diary)

tk78のメモ

2011-09-18

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

これは便利だなぁ〜。

2011-07-03

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 として保存してます)、デスクトップショートカットを作成します。

f:id:tk78:20110704014949j:image

ファイルを右クリック->送る->デスクトップショートカットを作成)


デスクトップ上のショートカットを右クリックしてプロパティを選択します。

f:id:tk78:20110704015636j:image


ショートカットキーのところで割り当てたいキーを入力します。

(参照:ショートカット キーを作成してプログラムを開く


「OK」ボタンをクリックすれば完了です。

これで【Ctrl】+【Alt】+【L】でロックできるようになりました!!!

2009-02-09

andLinux の Terminal が起動できなくなった

andLinux の Terminal で zshインストールして .zshrc を作成して、chsh とかしてから再起動させたら、Terminal が起動しなくなってしまった。

f:id:tk78:20090209161315j:image


zsh 云々が原因かは判らないけど、とりあえず andLinux を再インストールする!

2009-02-04

タイムアウトしたアプリを閉じる方法

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引数を変えて、ハンドルを開きなおす必要があるところでちょっと躓いたのでメモしておく。


参考にしたページ

no title

no title

2009-01-19 気軽に更新してみた。

フィールドサイズを変更する 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) | Microsoft Docs

sp_updateextendedproperty (TRANSACT-SQL) | Microsoft Docs

Connection: close