2012年11月3日土曜日

タイプウェル「J」@Asset 英単語

やめとけばいいのにまた配列替え。

今度はColemakからAssetです。


一応ColemakはSH~SG位までは行きました。

3回打っただけでもタイムが縮んでいっているので遅いなりにもやはり覚え始めは楽しいですね。

2012年8月25日土曜日

Excel VBA で無駄な選択範囲を縮めるコード

2010/6/20 にアップして 2011/06/01 に「修正版は後日」と書いて以来放置。

修正版です…。

図らずもあれから使用実績だけは重ねたので今度は多分大丈夫でしょう。

一番上の test_DecreaseRange がテストコードです。

引数 Range を受けて、データの入っていない空白セルを除いた Range を返します。

データの入ったワークシートで行全体や列全体、全セル等を選択して実行してみて下さい。

'---------------------------------------------------
'DecreaseToUsedRangeを最初に適用すると効率が良いはず
'---------------------------------------------------

Private Sub test_DecreaseRange()
    DecreaseRange(selection).Select
End Sub




Function DecreaseRange(a1 As Range) As Range
    
    Set DecreaseRange = _
            DecreaseLeft( _
            DecreaseRight( _
            DecreaseUpper( _
            DecreaseBottom( _
            DecreaseToUsedRange(a1)))))

End Function




Function DecreaseToUsedRange(a1 As Range) As Range
    
    r1 = a1.Row
    c1 = a1.Column
    r2 = a1.Rows.Count + r1 - 1
    c2 = a1.Columns.Count + c1 - 1
    
    Set ur = ActiveSheet.UsedRange
    r3 = ur.Row
    c3 = ur.Column
    r4 = ur.Rows.Count + r3 - 1
    c4 = ur.Columns.Count + c3 - 1
    
    b = (r1 > r4) Or (c1 > c4) Or _
        (r2 < r3) Or (c2 < c3) Or _
        a1.Address = "A1"
    If b Then
        
        'UsedRangeの外側が与えられた場合の処理
        '左上隅のセルを返す
        
        NewRow1 = r1
        NewColumn1 = c1
        NewRow2 = r1
        NewColumn2 = c1
        
    Else
    
        'UsedRangeの内側が与えられた場合の処理
        
        If r1 < r3 Then
            NewRow1 = r3
        Else
            NewRow1 = r1
        End If
        
        If c1 < c3 Then
            NewColumn1 = c3
        Else
            NewColumn1 = c1
        End If
        
        If r2 > r4 Then
            NewRow2 = r4
        Else
            NewRow2 = r2
        End If
        
        If c2 > c4 Then
            NewColumn2 = c4
        Else
            NewColumn2 = c2
        End If
        
    End If
    
    Set x = Range(Cells(NewRow1, NewColumn1), _
                  Cells(NewRow2, NewColumn2))
    
    Set DecreaseToUsedRange = x
              
End Function




Function DecreaseBottom(a1 As Range) As Range
    
    r1 = a1.Row
    c1 = a1.Column
    r2 = a1.Rows.Count + r1 - 1
    c2 = a1.Columns.Count + c1 - 1
    
    NewRow = r1
    For c = c1 To c2
        
        If IsError(Cells(r2, c)) Then
            NewRow = r2
            Exit For
        End If
        
        If Len(Cells(r2, c)) > 0 Then
            NewRow = r2
            Exit For
        End If
        
        r = Cells(r2, c).End(xlUp).Row
        If r > NewRow Then
            NewRow = r
        End If
        
    Next c

    Set x = Range(Cells(r1, c1), Cells(NewRow, c2))
    
    Set DecreaseBottom = x

End Function




Function DecreaseUpper(a1 As Range) As Range
    
    r1 = a1.Row
    c1 = a1.Column
    r2 = a1.Rows.Count + r1 - 1
    c2 = a1.Columns.Count + c1 - 1
    
    Set f = Application.WorksheetFunction
    
    NewRow = r2
    For r = r1 To r2
        x = Range(Cells(r, c1), Cells(r, c2))
        If f.CountA(x) > 0 Then
            NewRow = r
            Exit For
        End If
    Next r
    
    Set f = Nothing
    
    Set x = Range(Cells(NewRow, c1), Cells(r2, c2))

    Set DecreaseUpper = x

End Function




Function DecreaseRight(a1 As Range) As Range
    
    r1 = a1.Row
    c1 = a1.Column
    r2 = a1.Rows.Count + r1 - 1
    c2 = a1.Columns.Count + c1 - 1
    
    Set f = Application.WorksheetFunction
    
    NewColumn = c1
    For c = c2 To c1 Step -1
        x = Range(Cells(r1, c), Cells(r2, c))
        If f.CountA(x) > 0 Then
            NewColumn = c
            Exit For
        End If
    Next c
    
    Set f = Nothing
    
    Set x = Range(Cells(r1, c1), Cells(r2, NewColumn))

    Set DecreaseRight = x
    
End Function




Function DecreaseLeft(a1 As Range) As Range
    
    r1 = a1.Row
    c1 = a1.Column
    r2 = a1.Rows.Count + r1 - 1
    c2 = a1.Columns.Count + c1 - 1
    
    Set f = Application.WorksheetFunction
    
    NewColumn = c2
    For c = c1 To c2
        x = Range(Cells(r1, c), Cells(r2, c))
        If f.CountA(x) > 0 Then
            NewColumn = c
            Exit For
        End If
    Next c
    
    Set f = Nothing
    
    Set x = Range(Cells(r1, NewColumn), Cells(r2, c2))

    Set DecreaseLeft = x
    
End Function

Excel VBA で Desktop の Path を取得するコード

Private Sub test_DesktopPath()
    Debug.Print DesktopPath
End Sub

Private Function DesktopPath() As String
    DesktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
End Function

2012年8月24日金曜日

タイプウェル「SI」@Colemak 基本英単語1500

最近Blogサボってたなぁ。
Twitterがあまりにも楽チン過ぎて…。(;^ω^)

2012/8/18にDvorakも使い始めたのでちょっと記録。

あとColemakを一回だけ打ってみた。
ぶっつけでポンと打った記録なので多分これが現在の嘘のない常用速度かな、と。


ちなみにこの文章は新下駄配列で打ってます。
おいおいどこに行く、俺w。

2012年5月3日木曜日

skid patch の周期を表計算ソフトで視覚的に捉えてみた

1. A3 セルに以下の式を書いて B3 セルにコピー。
=IF(A2>=A$2,1,A2+1)

2. B3 セルには以下の数式が入っているはず。
=IF(B2>=B$2,1,B2+1)

3. A2:A3 を下方向に 1000 行程コピーする。

4. A2 セルと B2 セルにそれぞれ Chainwheel と Cog の歯数を入力。

5. オートフィルタを設定して Chainwheel の列を '1' で絞る。*別に '1' 以外でもOK。

フィルタで絞ってない状態が下図。


購入検討中の FUJI / Feather CX は
Chainwheel -> 42T
Cog -> 18T
なので Chainwheel を '1' で絞ると下図ように Cog が 1, 7, 13... の周期で現れる事が分かる。


最初は怖いので軽めのギア比でスタートするとして、慣れてきたら Chainwheel を素数のものに交換する予定。 42T より上の歯数で素数のものは 43T, 47T, 53T 辺り。

47T に交換したと仮定すると Cog の周期は下図のように 1, 12, 5, 16, 9, 2, 13, 6, 17, 10, 3, 14, 7, 18, 11, 4, 15, 8 と重複することなく並び Cog の枚数 18T だけ繰り返した後再び 1, 12, 5... を繰り返す。素数最強。


…まぁ skid とかやらないと思いますけどね…。

2012年5月1日火曜日

AutoHotKey で kbdacc

AutoHotKey を使って kbdacc っぽくキーリピートを加速するコードを書いてみました。
下向きの矢印キーを例にとります。

$Down::
    Send, {Down}
    Sleep, 1000 / 8
    i := 0
    Loop
    {
        If i < 4
            Sleep, 1
        Else
            Sleep, 0
        GetKeyState, State, Down, P
        If State = U
            Break
        Else
            Send, {Down}
        i += 1
    }
    Return

以下解説です。

    Send, {Down}
    Sleep, 1000 / 8
まずは Down キーを1回だけ送信してその後に 1 / 8 秒だけ待ちます。
1 / 8 秒はキーリピートが発動するまでの時間です。
1000 だと1秒なので好みの値を設定して下さい。

        If i < 4
            Sleep, 1
        Else
            Sleep, 0
最初の4回はやや遅めで繰り返します。
(それでも Windows のデフォルト値よりははるかに早いですが。)
この回数も好みで設定して下さい。

Sleep の値を増やすと動作がゆっくりになります。
0 に設定すると最高速でリピートします。
この値も好みで設定して下さい。

        GetKeyState, State, Down, P
        If State = U
            Break
Down キーの押下状態を取得して変数 State へ代入します。
U (Up) だったら Loop から抜けます。

        Else
            Send, {Down}
        i += 1
Down キーが押しっぱなしだったら Down を送信して i の値を一つ増やし Loop を継続します。
以上の処理を繰り返す事でキーリピートを実現しています。