エクセルでゲームを作っています。キャラクターはオートシェイプで作成。
昨晩、手抜きですが、ゼビウスのなかでも好きなキャラクターを作成することができました。
キャラクター作成はVBAのコーディングと比較するとつまんない。早くキャラクターを作り上げでコード作成をしたい。
ゾシーのキャラクターを作って見た。オートシェープで線と円を組み合わせ、グループ化させ、名前"shape31"を登録
VBAで
ActiveSheet.Shapes("shape31").Rotation = 0~360度
で回転させた。
エクセルでキャラクターを作るのはVBAより難しい。
1つのデータが2行に渡って入力されており、それが200件を超えており、2行を1行にまとめる次のようなマクロを作ってあげた。
Sub test()
Dim i As Long, j As Long
Application.ScreenUpdating = False
Rows("7:7").Select
Selection.AutoFilter
Selection.AutoFilter Field:=1, Criteria1:="計"
Rows("10:2000").Select
Selection.Delete Shift:=xlUp
Selection.AutoFilter
For i = Range("C65535").End(xlUp).Row To 9 Step -2
For j = 1 To 16
Cells(i, j) = Cells(i - 1, j) & Cells(i, j)
Next
Range(i - 1 & ":" & i - 1).Delete
Next
Application.ScreenUpdating = True
Range("A8").Select
End Sub
オートフィルターで、不必要な行(ここでは”計”となっている行)を削除し、2行を1行にして、不要な1行を削除。
当然、Application.ScreenUpdatingをFalseにして、作業速度アップ。たいしたマクロではないが、普段マクロを使うことのない人にとっては驚きのようだ。
またこの間、とある会社から、お金を払うからVBAを作ってくれないかと、メールで依頼があったが、簡単だったので、ただで作ってあげたらこれまた非常に喜んでくれた。
そんなにすごいことをした訳ではないが、チョッピリうれしかった。
オートシェープを.ThreeDで3D化して、
.ThreeD.RotationX や.ThreeD.RotationYでオートシェープを回転させて
敵キャラクターを表現しようとしていた。
3D化の例
With ActiveSheet.Shapes("shape21").ThreeD
.Visible = True
.Depth = 5
.ExtrusionColor.RGB = RGB(255, 255, 255)
.SetExtrusionDirection msoExtrusionTop
.PresetLightingDirection = msoLightingLeft
End With
回転の例
ActiveSheet.Shapes("shape21").ThreeD.RotationX = -90~90°
トーロイドやバキュラはオートシェイプが一つであるため
この方法で簡単に回転できるが、タルケン、カピ、テラジ等の
複数のオートシェイプを組み合わせて作ったキャラクターは、
とんでもないことになる。う~ん、こまったものだ。
標準で装備されている関数を何度か作ったことがある。
これ以外でも、まだ気が付かずに無駄なことをたくさんやっているんだろうな~
。
1.文字の色
VBAの場合
Function color(a As Range) As Long
color = a.Font.ColorIndex
End Function
VBAを使わない方法
挿入-名前-定義
名前:色
参照範囲:=GET.CELL(24,A1)
2.ファイル名の表示
VBAの場合
Function filename()
filename = ActiveWorkbook.Name
End Function
VBAを使わない場合1
=REPLACE(LEFT(CELL("filename"),FIND("]",CELL("filename"))-1),1,FIND("[",CELL("filename")),)
VBAを使わない場合2
名前定義
名前:ファイル名
参照範囲:=GET.DOCUMENT(88)
3.Find関数があるのにわざわざinstr関数を作ってしまった
VBAの場合
Function instr(a As Range, b As String)
instr = InStr(a.Value, b)
End Function
VBAを使わない場合
FIND関数
4.replace関数があるのにわざわざ同じものをつくってしまった
無駄な例
Function replace(a As String, b As String, c As String)
Dim e As Variant
e = Split(a, b)
replace = Join(e, c)
End Function
Sub test()
MsgBox replace("abcdefg", "cde", "")
End Sub
実はこれでだけでいい
Sub test2()
MsgBox Replace("abcdefg", "cde", "zzz")
End Sub
一緒に飲んだ。
話題で、今作ろうとしている作品の疑問点等、有益な情報を
GET!
今後の作品の制作スピードがアップしそう。
ありがとうY野君。でも、酔っぱらっているから、明日になったら
忘れているかも。
覚えていたら、お礼に、今度、VBAを教えてあげるね。
画像編集ソフト(PAINTSHOP、PHOTOSHOP,PHOTO EDITOR)で、画像をコピーし、
EXCELに貼り付けることがよくある。
元のファイルがJPEGであってもこの方法だとビットマップになり、膨大な
EXCELファイルになってしまう。
貼り付けるときに次のマクロを使うことで、自動的にJPGにしてくれるので、
愛用しています。
Sub bmp2jpg()
ActiveSheet.Paste
With Selection
.ShapeRange.Line.Visible = msoFalse
.Copy
.Delete
End With
ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False,DisplayAsIcon:=False
End Sub
やっていることは、
ビットマップで貼り付け後、コピー、形式を選択して貼り付け 図 (JPEG)で
貼り付ける形式を"図 (JPEG)"にしているだけ。
エラーチェックをしていないので、時々エラーが出ることがあります。
データ入力時に重複を避けたいので、次のようにした
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
For i = 1 To .Row
If .Value <> "" Then
If .Value = Cells(i, .Column) Then
MsgBox "重複しています"
.Select
Exit For
End If
End If
Next
End With
End Sub
入力規則でできるのでは?と言われたので、やってみた。
例)B列の設定
入力規則で
ユーザー設定 =COUNTIF(B:B,B1)=1
ついでに条件付書式で
数式 =COUNTIF(B:B,B1)>1
書式-パターン-赤
VBAよりシンプルだ。でもVBAで処理する方が素敵だと、いつも自分に言い聞かす
配列b(0)=12,b(1)=34,b(2)=56に入力する場合
b(0)=left(a,2)
b(1)=mid(a,4,2)
b(2)=right(a,2)としてた。
最近、
Dim b As Variant
b = Split(a, ":")
でできることを知った。
セル[A1],[B1],[C1]へ12,34,56
を入力するには
Range("A1:C1") = Split(a, ":")で一発!

