やめとけばいいのにまた配列替え。
今度はColemakからAssetです。
一応ColemakはSH~SG位までは行きました。
3回打っただけでもタイムが縮んでいっているので遅いなりにもやはり覚え始めは楽しいですね。
2012年11月3日土曜日
2012年8月25日土曜日
Excel VBA で無駄な選択範囲を縮めるコード
2010/6/20 にアップして 2011/06/01 に「修正版は後日」と書いて以来放置。
修正版です…。
図らずもあれから使用実績だけは重ねたので今度は多分大丈夫でしょう。
一番上の test_DecreaseRange がテストコードです。
引数 Range を受けて、データの入っていない空白セルを除いた Range を返します。
データの入ったワークシートで行全体や列全体、全セル等を選択して実行してみて下さい。
修正版です…。
図らずもあれから使用実績だけは重ねたので今度は多分大丈夫でしょう。
一番上の 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
2012年8月24日金曜日
2012年5月3日木曜日
skid patch の周期を表計算ソフトで視覚的に捉えてみた
1. A3 セルに以下の式を書いて B3 セルにコピー。
2. B3 セルには以下の数式が入っているはず。
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 とかやらないと思いますけどね…。
=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 っぽくキーリピートを加速するコードを書いてみました。
下向きの矢印キーを例にとります。
以下解説です。
1 / 8 秒はキーリピートが発動するまでの時間です。
1000 だと1秒なので好みの値を設定して下さい。
(それでも Windows のデフォルト値よりははるかに早いですが。)
この回数も好みで設定して下さい。
Sleep の値を増やすと動作がゆっくりになります。
0 に設定すると最高速でリピートします。
この値も好みで設定して下さい。
U (Up) だったら Loop から抜けます。
以上の処理を繰り返す事でキーリピートを実現しています。
下向きの矢印キーを例にとります。
$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 を継続します。以上の処理を繰り返す事でキーリピートを実現しています。
登録:
投稿 (Atom)