• ベストアンサー

※VBA配列

http://oshiete1.goo.ne.jp/qa5196795.htmlで 質問させてもらった者です。質問不足だったため 質問の内容を追加したかったのですが、追加の方法がわからず またこちらで質問させていただきました Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub a~tの文字が、上記のような動きをする プログラムを作成するにはどのように配列を活かせばいいですか? 配列がよくわかっておらず勉強したのですが…使えずにいます;;

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

配列といっても普通はそんなに難しいものではありませんが、 今回のような場面での使い方は正直言って質問者には少々無理があるかと。 ま、それを言ってしまえば先に進みませんので配列の勉強のためにということで ●、▼、■の3文字を配列に使ったコードを提示します。 コードをじっくり眺めて本来の、abc~tにトライしてみてください。 '------------------------------------------------  Option Explicit  Dim time1 As Integer, time2 As Integer  Dim yoko As String, tate As String  Dim i As Long  Dim X() As Long  Dim Y() As Long  Dim Moji() As String  Const nMax As Integer = 3  '●表示文字の最大個数 '-------------------------------------------------- Sub 描画()  For i = 1 To nMax    Cells(Y(i), X(i)).Value = Moji(i)  Next i End Sub '-------------------------------------------------- Sub 削除()   Cells(Y(nMax), X(nMax)).Value = "" End Sub '-------------------------------------------------- Sub 待機()  For time1 = 0 To 1000    For time2 = 0 To 1000    Next  Next End Sub '-------------------------------------------------- Sub 座標移動()  For i = nMax To 2 Step -1    X(i) = X(i - 1)    Y(i) = Y(i - 1)  Next i  If yoko = "右" Then    X(1) = X(1) + 1  Else    X(1) = X(1) - 1  End If  If X(1) = 30 Then    yoko = "左"  ElseIf X(1) = 1 Then    yoko = "右"  End If  If tate = "上" Then    Y(1) = Y(1) + 1  Else    Y(1) = Y(1) - 1  End If  If Y(1) = 20 Then    tate = "下"  ElseIf Y(1) = 1 Then    tate = "上"  End If End Sub '-------------------------------------------------- '-------------------------------------------------- Sub main()  ReDim X(1 To nMax) As Long  ReDim Y(1 To nMax) As Long  ReDim Moji(1 To nMax) As String  Moji(1) = "●"  Moji(2) = "▼"  Moji(3) = "■"  For i = 1 To nMax    X(i) = 1    Y(i) = 1  Next i  yoko = "右"  tate = "上"  Do    描画    待機    削除    待機    座標移動  Loop End Sub '-------------------------------------------------- 以上です。    

moguraaaaa
質問者

お礼

動かす文字が多いので… 配列が一番無難かと思ったのですが 他にも良い方法はあったのでしょうか; コードの方参考にさせて頂きます ありがとうございます!

moguraaaaa
質問者

補足

>myRange様 お手数ですが面倒でなければ 簡単にプログラムの意味を 一行ずつ教えては頂けないでしょうか?; 教えていただける範囲内でいいので…! すみません(--;

その他の回答 (3)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

回答2、myRangeです。 >お手数ですが面倒でなければ >簡単にプログラムの意味を >一行ずつ教えては頂けないでしょうか?; 説明するに吝かではありませんが、 "一行ずつ簡単に"、と言われてもそれはできません。 なぜなら現時点での質問者の理解度がこちらには分からないからです。 質問者提示の配列を使わないコードは完全に理解されいるのでしょうか? また、当方提示のコードはどこまで読み解いたのでしょうか。 質問するときは、自分でどこまで理解しようと努めたか、その結果どこが分からないのか、それを明示すべきです。 それも無しにただ、"全て一行ずつ説明してくれ"では、正直言って、おい、おい、といった感じでしょうか。 何れにしろ、それらを明示したうえで再質問願います。 以上です。

moguraaaaa
質問者

お礼

間違いないです; 頼ってばかりで申し訳ありませんでした For i = nMax To 2 Step -1    X(i) = X(i - 1)    Y(i) = Y(i - 1) の箇所がよくわからなかったのですが ここまでプログラムを教えていただいたので 自力で理解してゆきます。 ありがとうございました★

回答No.3

私もVBA初心者ですので挑戦してみました。 下記コードです。●▲■が具体的にどうなればいいのかわからなかったので●を追いかけて▲■がついてくるようになっています。 また、コード中の「Mark() = Array("●", "▲", "■")」の部分を 「Mark() = Array("a", "b", "c", "d", "e")」とa~tを指定するとa~tが動きます。 150回実行したら止まるようになってます。 セルの大きさを調整して試してみてください。 スタート位置はB2ですので、セルB2からAE21に枠線を引いて みるとわかりやすいかも(縦20x横30です)。 ============================= Option Explicit Declare Function timeGetTime Lib "winmm.dll" () As Long Public Const StartCol As Integer = 2   'スタート位置の列番号 Public Const StartRow As Integer = 2   'スタート位置の行番号 Public Const UpWallRow As Integer = 2   '天井の行番号 Public Const DownWallRow As Integer = 21 '床の行の行番号 Public Const LeftWallCol As Integer = 2 '壁(左)の列番号 Public Const RightWallCol As Integer = 31 '壁(右)の列番号 Sub Main() Dim Mark() As Variant Dim X() As Integer Dim Y() As Integer Dim IdouHabaX As Integer Dim IdouHabaY As Integer Dim WaitTime As Integer Dim i As Integer Dim Kaisuu As Integer '変数初期化 Mark() = Array("●", "▲", "■") ReDim X(UBound(Mark)) ReDim Y(UBound(Mark)) X(0) = StartCol Y(0) = StartRow For i = 1 To UBound(Mark)   X(i) = 0   Y(i) = 0 Next i IdouHabaX = 1 IdouHabaY = 1 WaitTime = 50 Kaisuu = 0 Do   Call 描画(X, Y, Mark)   Call 待機(WaitTime)   Call 削除(X, Y)   Call 座標移動(X, Y, IdouHabaX, IdouHabaY)   Kaisuu = Kaisuu + 1   If Kaisuu = 150 Then Exit Do Loop End Sub Private Sub 描画(ByRef X, Y, Mark As Variant) Dim i As Integer For i = 0 To UBound(X)   If X(i) > 0 Or Y(i) > 0 Then     Cells(X(i), Y(i)).Value = Mark(i)   End If Next i End Sub Private Sub 待機(ByVal WaitTime As Long) Dim IniTime As Long IniTime = timeGetTime() Do While timeGetTime() - IniTime < WaitTime   DoEvents Loop End Sub Private Sub 削除(ByRef X, Y As Variant) Dim i As Integer For i = 0 To UBound(X)   If X(i) > 0 Or Y(i) > 0 Then     Cells(X(i), Y(i)).Value = ""   End If Next i End Sub Private Sub 座標移動(ByRef X, Y, IdouHabaX, IdouHabaY As Variant) Dim i As Integer For i = UBound(X) To 1 Step -1   X(i) = X(i - 1)   Y(i) = Y(i - 1) Next i X(0) = X(0) + IdouHabaX Y(0) = Y(0) + IdouHabaY If X(0) = UpWallRow Or X(0) = DownWallRow Then   IdouHabaX = IdouHabaX * (-1) End If If Y(0) = LeftWallCol Or Y(0) = RightWallCol Then   IdouHabaY = IdouHabaY * (-1)    End If

moguraaaaa
質問者

お礼

こんなにVBA理解されていて 初心者なんてことないですよ-! 私にはまだ理解できていない箇所が 幾つかありますが、参考にさせて頂きます! ご丁寧にありがとうございましたー!

回答No.1

>a~tの文字が、上記のような動きをする a~tじゃなくて●▲■ですか? たぶん上記のコードじゃ動かないと思うのですが、動かないコードを示されて「上記のような動き」といわれても。。。 >どのように配列を活かせばいいですか? 配列は宣言すらされてないようですが? 配列がないとプログラムを組めないわけではないですが? つっこみどころ満載と思われますがとりあえず1つ。 Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub X,Y,X1,Y1,X2,Y2の値はどうするつもりですか? main()から渡すんじゃないですか? 配列を活かすとかより前の話では。

moguraaaaa
質問者

補足

>「上記のような動き」といわれても。。。 ●▲■が20×30のセル内を 跳ね返って動くというプログラムで… こちらの→ http://oshiete1.goo.ne.jp/qa5166089.html 回答番号:No2の方の映像のような動きです。 >配列は宣言すらされてないようですが? こちらが→http://oshiete1.goo.ne.jp/qa5196795.html 私が考えた配列のプログラムなのですが いろいろと指摘を頂き、また質問をさせて頂きました 今回質問で記したプログラムは、配列を使用して こんな動きがしたいということで記しただけのものです つっこみ満載の質問で申し訳ありません;; まだ不足している質問箇所いくつもあるのですが どうやって内容を話せばいいかわからず… こうやって一つ一つ訊いて頂き助かります お手数おかけしてすみません。ありがとうございます

関連するQ&A