Hatena::ブログ(Diary)

七誌の開発日記(旧) このページをアンテナに追加 RSSフィード

新ブログ Twitter OneDrive Wiki

2010-09-11

[][]無圧縮ZIP

f:id:n7shi:20100911012620p:image:right

Excelから無圧縮ZIPを出力してみました。パブリックドメインとして置いておきます。

VBAのコードだけを抜粋したものも置いておきます。

CRCの計算は昨日のコード(id:n7shi:20100910)を使っています。ちなみに元ネタはF#です。

2010-09-10

[][]CRC-32

Excelから無圧縮ZIPを出力できると便利そうなので、取っ掛かりとしてVBACRC-32を実装してみました。CRC-32の計算方法はid:n7shi:20100905を参照してください。

Option Explicit

Dim Crc32Table&(255)

Private Sub InitCrc32Table()
    Dim I%, J%, R&, R1&
    For I = 0 To 255
        R = I
        For J = 0 To 7
            R1 = R And 1
            R = (R - R1) / 2
            If R < 0 Then R = R - &H80000000
            If R1 Then R = R Xor &HEDB88320
        Next J
        Crc32Table(I) = R
    Next I
End Sub

Public Function GetCrc32&(A$)
    Dim R&, I%, B As Byte
    If Crc32Table(255) = 0 Then InitCrc32Table
    R = Not 0
    For I = 1 To Len(A)
        B = Asc(Mid(A, I, 1))
        R = (Int(R / 256) And &HFFFFFF) Xor Crc32Table((R Xor B) And &HFF)
    Next I
    GetCrc32 = Not R
End Function

Public Function GetCrc32FromFile&(Path$)
    Dim R&, I&, B As Byte, FL&
    If Crc32Table(255) = 0 Then InitCrc32Table
    FL = FileLen(Path)
    Open Path For Binary Lock Read As #2
    R = Not 0
    For I = 1 To FL
        Get #2, , B
        R = (Int(R / 256) And &HFFFFFF) Xor Crc32Table((R Xor B) And &HFF)
    Next I
    Close #2
    GetCrc32FromFile = Not R
End Function

2010-06-22

[][][]クロス開発

昨日と同じネタですが、今日はWindows CE系が対象です。使用しているファイルはid:n7shi:20100519のものです。

f:id:n7shi:20100622125727p:image:medium:right

f:id:n7shi:20100622122904p:image:medium:right

【画像左】Windows Mobileエミュレータ(ARM)の共有フォルダ機能でホストのフォルダをマウントして、ExcelからクロスビルドしたEXEを実行しています。

【画像右】古いSDKに付いてくるPocket PCエミュレータx86なので、デスクトップ用のWindowsとの違いを比較するのにはちょうど良いです。

Windows Phone 7ではネイティブバイナリや野良アプリが禁止されるので、こういう遊びができなくなってしまいます。

2010-06-21

[][]クロス開発

f:id:n7shi:20100621195932p:image:medium:right

ホスト側でExcelコンパイラ(id:n7shi:20100519)を動かして、NT4/MIPSゲスト側(id:n7shi:20100609)から共有フォルダ経由でEXEを実行してみました。クロス開発です。

NT4/MIPSで動くExcelを持っていないので、このような形になりました。

2010-05-20

[]ファイル名操作マクロ

Excelのマクロでファイル名を操作するため.NET風の名前の関数を作りました。単純なものですが私はよく使うので、参考までにパブリックドメインで公開します。

Function Path_GetFileName$(A$)
    Dim P%
    P = InStrRev(A, "\")
    If P > 0 Then
        Path_GetFileName = Mid(A, P + 1)
    Else
        Path_GetFileName = A
    End If
End Function

Function Path_GetDirectoryName$(A$)
    Dim P%
    P = InStrRev(A, "\")
    If P > 3 Then
        Path_GetDirectoryName = Left(A, P - 1)
    Else
        Path_GetDirectoryName = A
    End If
End Function

Function Path_Combine$(A$, B$)
    If Right(A, 1) = "\" Then
        Path_Combine = A & B
    Else
        Path_Combine = A & "\" & B
    End If
End Function

Function File_Exists(F$) As Boolean
    Dim FL&
    On Error GoTo ERROR
    FL = FileLen(F)
    On Error GoTo 0
    File_Exists = True
    Exit Function
ERROR:
    On Error GoTo 0
    File_Exists = False
End Function

2010-05-19

[][]コンパイラ

id:n7shi:20100305Excel上のネイティブコンパイラをARMに対応しましたが、今回MIPSに対応しました。MIPS用のNT4とCEに対応しています。QEMU上のNT4/MIPSで動作を確認しました。

以下のアーキテクチャを切り替えられます。

2010-03-05

[][][]コンパイラWindows Mobile対応)

id:n7shi:20100303で公開したExcel上で動くコンパイラが割と好評だったようなので、調子に乗ってWindows Mobile用のARMバイナリも出力できるようにしてみました。

x86を直訳したような冗長なARMのコードを吐きます。残念ながらPocket Excelではマクロが動かないため使えません。

2010-03-03

[]コンパイラ

masapicoさんによるWindowsの実行ファイル(PE)を出力する簡単なコンパイラがあります。

今となってはVB6は簡単には手に入りませんが、VBはGUIを除けばVBA(Officeのマクロ言語)と共通です。そのためGUIをワークシートで代用してExcelに移植したものが以下です。ExcelからEXEを出力して実行します。

せっかくExcelで表が組めるので、PEの構造をマクロからワークシートに出してまとめたものが以下です。シートに並んでいるバイナリを基にEXEを出力して実行します。

単なる思い付きでやってみたのですが、仕様書と開発環境が一体となって、Excelの可能性を感じます。関連があるかは分かりませんが、『Excelプロトタイピング』という本が出版されるようです。

2009-06-02

[]オートシェイプの複数選択

マクロでオートシェイプを複数選択するとき、RangeにNameの配列を渡します。

ActiveSheet.Shapes.Range(Array("Picture 1", "Rectangle 1")).Select

Excel 2003ではNameプロパティの数字部分は自動で割り振られていたのですが、Excel 2007ではコピーすると同じNameのままになってしまうため、目的のものがうまく選択できないという問題が発生しました。Rangeに渡す配列には序数も指定できるため、それを使って回避しました。

ActiveSheet.Shapes.Range(Array(1, 2)).Select

序数はShapes(index)のindexですが、Shapeオブジェクトから直接取得できないため、ForループでShapesを走査して対象のShapeオブジェクトを見付ける必要があるようです。

2009-05-11

[]オートシェイプ内テキストボックスの削除

Excelでオートシェイプを選択してテキストの追加を選んだりキーを押したりするとテキストボックスが付きます。間違えて付けてしまっても削除する方法がありません。どうしても邪魔な場合、同じ位置・形・色でオートシェイプを作成して、元のオートシェイプを削除することになります。

この作業を自動で行うマクロを作成しました。

Sub 枠内削除()
    Dim W As Worksheet, SH As Shape, NSH As Shape, C As Collection, T$
    For Each W In Worksheets
        Set C = New Collection
        For Each SH In W.Shapes
            If SH.AutoShapeType = msoShapeRectangle And Not SH.Fill.Visible Then
                On Error Resume Next
                T = "NO"
                T = SH.TextFrame.Characters.Text
                If T = "" Then C.Add SH
                On Error GoTo 0
            End If
        Next SH
        For Each SH In C
            Set NSH = W.Shapes.AddShape(msoShapeRectangle, SH.Left, SH.Top, SH.Width, SH.Height)
            NSH.Fill.Visible = msoFalse
            NSH.Line.Visible = SH.Line.Visible
            NSH.Line.Style = SH.Line.Style
            NSH.Line.Weight = SH.Line.Weight
            NSH.Line.ForeColor = SH.Line.ForeColor
            NSH.ControlFormat.PrintObject = SH.ControlFormat.PrintObject
            SH.Delete
        Next SH
    Next W
End Sub

このマクロは四角形のオートシェイプだけを対象としています。それ以外の用途には改造してみてください。