Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


207 / 3841 ページ ←次へ | 前へ→

【78312】Re:Randomwalk
質問  kinoko  - 16/6/24(金) 12:36 -

引用なし
パスワード
   ▼β さん:

ありがとうございます。参考になりました。
あと一つだけ聞きたいのですが

行と列が0にならないようにする処理はβ さんのプログラムではどこに書かれてますか?

if do loop 乱数発生 case select 値の入れ替えぐらいしか習っていなくて
これらを駆使して作りたいのですが可能ですか?

何度も質問して申し訳ありません...
・ツリー全体表示

【78311】Re:Randomwalk
発言  β  - 16/6/24(金) 8:54 -

引用なし
パスワード
   ▼kinoko さん:

アップしたコードにバグありました。
Sample,Sample2 ともに

    If i = l And j = t Then   '領域の左上隅
      pos = Array(5, 7, 8)
    ElseIf i = r And j = t Then '領域の右上隅
      pos = Array(4, 6, 7)

これを

    If i = t And j = l Then   '領域の左上隅
      pos = Array(5, 7, 8)
    ElseIf i = t And j = r Then '領域の右上隅
      pos = Array(4, 6, 7)

にしてください。
・ツリー全体表示

【78310】Re:Randomwalk
発言  β  - 16/6/24(金) 0:46 -

引用なし
パスワード
   ▼kinoko さん:

>一度通ったところは赤、二度目は青色っていう

ということなら色相返還をしなくてもいいので、アップした、共通モジュールプロシジャは必要なく
以下のみでOKですね。
色の順番は ★のところで規定しています。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

Sub Sample2()
  Dim i As Long
  Dim j As Long
  Dim n As Long
  Dim t As Long
  Dim l As Long
  Dim r As Long
  Dim b As Long
  Dim a As Range
  Dim rtn As Long
  Dim pos As Variant
  Dim color As Variant
  
  Cells.Clear
  
  Randomize

  Cells.RowHeight = 5
  Cells.ColumnWidth = 0.5
  
  With ActiveWindow.VisibleRange
    t = .Row
    b = .Rows.Count
    l = .Column
    r = .Columns.Count
  End With
  
  color = Array(vbRed, vbBlue, vbMagenta, vbYellow, vbCyan, vbBlack, vbRed)  '★
  
  '最初のセルを選定
  i = Int((b - t + 1) * Rnd + t)
  j = Int((r - l + 1) * Rnd + l)
  Cells(i, j).Interior.color = vbRed
  
  Do
    
    rtn = GetAsyncKeyState(16) 'シフトキー
    rtn = rtn And &H80000000
    If rtn <> 0 Then Exit Do
    
    If i = l And j = t Then   '領域の左上隅
      pos = Array(5, 7, 8)
    ElseIf i = r And j = t Then '領域の右上隅
      pos = Array(4, 6, 7)
    ElseIf i = b And j = l Then '領域の左下隅
      pos = Array(2, 3, 5)
    ElseIf i = b And j = r Then '領域の右下隅
      pos = Array(1, 2, 6)
    ElseIf i = t Then      '領域の上辺
      pos = Array(4, 5, 6, 7, 8)
    ElseIf i = b Then      '領域の下辺
      pos = Array(1, 2, 3, 4, 5)
    ElseIf j = l Then      '領域の左端
      pos = Array(2, 3, 5, 7, 8)
    ElseIf j = r Then      '領域の右端
      pos = Array(1, 2, 4, 6, 7)
    Else
      pos = Array(1, 2, 3, 4, 5, 6, 7, 8)
    End If
    
    n = Int((UBound(pos) - LBound(pos) + 1) * Rnd + LBound(pos))
    n = pos(n)
    
    'セル移動
    Select Case n
      Case 1: i = i - 1: j = j - 1
      Case 2: i = i - 1
      Case 3: i = i - 1: j = j + 1
      Case 4: j = j - 1
      Case 5: j = j + 1
      Case 6: i = i + 1: j = j - 1
      Case 7: i = i + 1
      Case 8: i = i + 1: j = j + 1
    End Select
    
    With Cells(i, j).Interior
      If .ColorIndex = xlNone Then
        .color = vbRed     '最初は赤
      Else
        n = WorksheetFunction.Match(.color, color, 0)
        .color = color(n)
      End If
    End With
    
    Sleep 10
    DoEvents
    
  Loop
  
End Sub
・ツリー全体表示

【78309】Re:Randomwalk
回答  kinoko  - 16/6/24(金) 0:03 -

引用なし
パスワード
   >壁 とは 具体的にどこを想定されています?
>PC画面に見えている範囲のことですか?

説明を忘れていました。行や列が0をせずになんとか止まらず動かしていきたいって感じです。壁というのは行と列ですね。申し訳ないです。

>色を変えていく処理
>どんなように変化させていきたいですか?

一度通ったところは赤、二度目は青色っていう風にしてみたいんですけど、まず0になってエラー吐くんでできてないんですよね…
・ツリー全体表示

【78308】Re:Randomwalk
発言  β  - 16/6/23(木) 21:48 -

引用なし
パスワード
   ▼kinoko さん:

私も一例を。

動きの枠を、今、デスクトップに表示されているエクセルシートの範囲にしています。
ただし、かなり細かなマス目にしてありますよね。【壁】には、なかなか到達しないかもしれません。
気長に眺めていれば、いつかは壁にぶつかって、壁の外にはいかない動きをします。

すでに通り過ぎて色がついているセルについては、HSV色相で左回りに10°ずつ、色を変化させています。
h tps://ja.wikipedia.org/wiki/%E8%89%B2%E7%9B%B8

なお、HSV色相に関してはVBAでは標準の変換関数がないので自前で共通プロシジャとして使っているものを
使います。

Shiftキーを眺めに押せば、終了します。

●テストモジュール

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

Sub Sample()
  Dim i As Long
  Dim j As Long
  Dim n As Long
  Dim t As Long
  Dim l As Long
  Dim r As Long
  Dim b As Long
  Dim a As Range
  Dim rtn As Long
  Dim d As HSVSET
  Dim pos As Variant
  
  Cells.Clear

  Randomize

  Cells.RowHeight = 5
  Cells.ColumnWidth = 0.5
  
  With ActiveWindow.VisibleRange
    t = .Row
    b = .Rows.Count
    l = .Column
    r = .Columns.Count
  End With
  
  '最初のセルを選定
  i = Int((b - t + 1) * Rnd + t)
  j = Int((r - l + 1) * Rnd + l)
  Cells(i, j).Interior.Color = vbRed
  
  Do
    
    rtn = GetAsyncKeyState(16) 'シフトキー
    rtn = rtn And &H80000000
    If rtn <> 0 Then Exit Do
    
    If i = l And j = t Then   '領域の左上隅
      pos = Array(5, 7, 8)
    ElseIf i = r And j = t Then '領域の右上隅
      pos = Array(4, 6, 7)
    ElseIf i = b And j = l Then '領域の左下隅
      pos = Array(2, 3, 5)
    ElseIf i = b And j = r Then '領域の右下隅
      pos = Array(1, 2, 6)
    ElseIf i = t Then      '領域の上辺
      pos = Array(4, 5, 6, 7, 8)
    ElseIf i = b Then      '領域の下辺
      pos = Array(1, 2, 3, 4, 5)
    ElseIf j = l Then      '領域の左端
      pos = Array(2, 3, 5, 7, 8)
    ElseIf j = r Then      '領域の右端
      pos = Array(1, 2, 4, 6, 7)
    Else
      pos = Array(1, 2, 3, 4, 5, 6, 7, 8)
    End If
    
    n = Int((UBound(pos) - LBound(pos) + 1) * Rnd + LBound(pos))
    n = pos(n)
    
    'セル移動
    Select Case n
      Case 1: i = i - 1: j = j - 1
      Case 2: i = i - 1
      Case 3: i = i - 1: j = j + 1
      Case 4: j = j - 1
      Case 5: j = j + 1
      Case 6: i = i + 1: j = j - 1
      Case 7: i = i + 1
      Case 8: i = i + 1: j = j + 1
    End Select
    
    With Cells(i, j).Interior
      If .ColorIndex = xlNone Then
        .Color = vbRed     '最初は赤
      Else
        d = RGB2HSV(.Color)
        d.h = d.h + 10     '次からは色相を10°左回りに移動した色
        .Color = HSV2RGB(d)
      End If
    End With
    
    Sleep 10
    DoEvents
    
  Loop
  
End Sub

●共通プロシジャモジュール

Public Type HSVSET
  h As Double
  s As Double
  v As Double
End Type

Public Type RGBSET
  r As Long
  g As Long
  b As Long
End Type

Function RGB2HSV(rgbVal As Long) As HSVSET
  Dim mx As Long
  Dim mn As Long
  Dim r As Long
  Dim g As Long
  Dim b As Long
  Dim z As RGBSET
  
  z = divRGB(rgbVal)
  
  r = z.r
  g = z.g
  b = z.b
  
  mn = WorksheetFunction.Min(r, g, b)
  mx = WorksheetFunction.Max(r, g, b)
  
  If mx = mn Then
    RGB2HSV.h = 0
  Else
    Select Case mx
      Case r
        RGB2HSV.h = (60 * (g - b) / (mx - mn) + 360)
        If (RGB2HSV.h >= 360#) Then
          RGB2HSV.h = RGB2HSV.h - 360#
        End If
      Case g
        RGB2HSV.h = 60 * (b - r) / (mx - mn) + 120
      Case b
        RGB2HSV.h = 60 * (r - g) / (mx - mn) + 240
    End Select
  End If
  
  If mx = 0 Or mx = mn Then
    RGB2HSV.s = 0
  Else
    RGB2HSV.s = 255 * ((mx - mn) / mx)
  End If
  
  RGB2HSV.v = mx
  
End Function

Function HSV2RGB(d As HSVSET) As Long
  Dim r As Long
  Dim g As Long
  Dim b As Long
  Dim f As Double
  Dim i As Long
  Dim p As Long
  Dim q As Long
  Dim t As Long
  Dim h As Double
  Dim s As Double
  Dim v As Double
 
  If d.s = 0 Then
    r = d.v
    g = d.v
    b = d.v
  Else
    h = d.h
    s = d.s
    v = d.v
    If h = 360 Then h = 0
    i = Int(h / 60) Mod 6
    f = h / 60 - Int(h / 60)
    p = Int(CInt(v * (1 - (s / 255))))
    q = Int(CInt(v * (1 - (s / 255) * f)))
    t = Int(CInt(v * (1 - ((s / 255) * (1 - f)))))
    
    Select Case i
      Case 0: r = v: g = t: b = p
      Case 1: r = q: g = v: b = p
      Case 2: r = p: g = v: b = t
      Case 3: r = p: g = q: b = v
      Case 4: r = t: g = p: b = v
      Case 5: r = v: g = p: b = q
    End Select
  End If
  
  HSV2RGB = RGB(r, g, b)
  
End Function

Function divRGB(rgbVal As Long) As RGBSET
  divRGB.b = rgbVal \ 256 ^ 2
  divRGB.g = (rgbVal - divRGB.b * 256 ^ 2) \ 256
  divRGB.r = rgbVal - divRGB.b * 256 ^ 2 - divRGB.g * 256
End Function
・ツリー全体表示

【78307】Re:Randomwalk
発言  カリーニン  - 16/6/23(木) 21:23 -

引用なし
パスワード
   横から失礼します。

面白そうですね。やってることは違いますが、昔似たような?ことをしたことがありますので
参考出品します。
test
の中の
Call main(200)
の数値を変えて試してみてください。

Option Explicit
Public mystop As Boolean
Public r As Range

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim saidai As Long
Dim saishou As Long
Dim cnt As Long
Dim NRng As Range
Dim hantei As Boolean
Dim bl As Boolean
Dim prerng As Range
Dim iti As String

Sub test()
Call main(200)
End Sub

Function main(ByVal maxnum As Long)
Dim ws As Worksheet
mystop = True
saidai = 4
saishou = 1
cnt = 1
Set ws = ThisWorkbook.Worksheets(1)
Application.ScreenUpdating = False
ws.Cells.Delete
Application.ScreenUpdating = True
ws.Cells.ColumnWidth = 2.5
ws.Cells(1, 1).Value = cnt
Set r = ws.Cells(1, 1)
bl = False
Do Until bl = True
 If mystop = False Then Exit Do
 bl = False
 Call nextrng
 cnt = cnt + 1
 '**********
 If cnt = 2 Then
   Set prerng = ws.Cells(1, 1)
'   Set r = prerng
   If NRng.Address = prerng.Offset(1).Address Then
    With prerng
    '上
     With .Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
     End With
    '左
     With .Borders(xlEdgeLeft)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
     '右
     With .Borders(xlEdgeRight)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    End With
   Else
    With prerng
    '上
     With .Borders(xlEdgeTop)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
     '下
     With .Borders(xlEdgeBottom)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '左
     With .Borders(xlEdgeLeft)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    End With
   End If
 Else
   iti = prerng.Row - r.Row & _
   prerng.Column - r.Column & r.Row - NRng.Row & r.Column - NRng.Column
  'MsgBox cnt & " " & iti
 Select Case iti
  Case "-10-10"
  Call kei1
  Case "-100-1"
  Call kei2
  Case "-1001"
  Call kei3
  Case "1010"
  Call kei1
  Case "100-1"
  Call kei4
  Case "1001"
  Call kei5
  Case "0-1-10"
  Call kei5
  Case "0-110"
  Call kei3
  Case "0-10-1"
  Call kei6
  Case "01-10"
  Call kei4
  Case "0110"
  Call kei2
  Case "0101"
  Call kei6
 End Select
 End If
 If cnt = maxnum Then
   If NRng.Address = r.Offset(1).Address Then
    With NRng
    '左
     With .Borders(xlEdgeLeft)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '右
     With .Borders(xlEdgeRight)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '下
     With .Borders(xlEdgeBottom)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    End With
   ElseIf NRng.Address = r.Offset(-1).Address Then
    With NRng
    '左
     With .Borders(xlEdgeLeft)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '右
     With .Borders(xlEdgeRight)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '上
     With .Borders(xlEdgeTop)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    End With
   ElseIf NRng.Address = r.Offset(, 1).Address Then
    With NRng
    '右
     With .Borders(xlEdgeRight)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '上
     With .Borders(xlEdgeTop)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '下
     With .Borders(xlEdgeBottom)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    End With
   Else
    With NRng
    '左
     With .Borders(xlEdgeLeft)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '上
     With .Borders(xlEdgeTop)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    '下
     With .Borders(xlEdgeBottom)
     .LineStyle = xlContinuous
     .Weight = xlThin
     .ColorIndex = xlAutomatic
     End With
    End With
   End If
 End If
 If cnt > 1 Then
   Set prerng = r
 Else
   Set prerng = Worksheets(1).Cells(1, 1)
 End If
 NRng.Value = cnt
 Set r = NRng
 Call hukuro
 Application.StatusBar = cnt
 DoEvents
 If hantei = True Then
   'bl = True
   Call main(maxnum)
   Exit Do
 End If
 'Sleep 10
 Sleep 1
  If cnt = maxnum Then
   ws.UsedRange.EntireColumn.AutoFit
    bl = True
   MsgBox "完了"
   Exit Do
  End If
 Loop
 'If cnt = maxnum Then MsgBox "完了"
 Set ws = Nothing
End Function

Function nextrng()
Dim Myrnd As Long
Dim chk As Boolean
 chk = True
 Randomize
 Myrnd = Int((saidai - saishou + 1) * Rnd + saishou)
 Select Case Myrnd
  Case 1
  If r.Row = 65536 Then
    chk = False
  Else
    Set NRng = r.Offset(1)
  End If
  Case 2
  If r.Row = 1 Then
    chk = False
  Else
   Set NRng = r.Offset(-1)
  End If
  Case 3
  If r.Column = 256 Then
    chk = False
  Else
    Set NRng = r.Offset(, 1)
  End If
  Case 4
  If r.Column = 1 Then
    chk = False
  Else
    Set NRng = r.Offset(, -1)
  End If
  End Select
 
  If chk = False Then
   Call nextrng
  End If
  If NRng.Value <> "" Then
   Call nextrng
  End If
End Function

Function hukuro()
  hantei = False
  If NRng.Row = 1 Then
   If NRng.Column = 1 Then
     If NRng.Offset(1).Value <> "" And NRng.Offset(, 1).Value <> "" Then
      hantei = True
     End If
   ElseIf NRng.Column = 256 Then
     If NRng.Offset(1).Value <> "" And NRng.Offset(, -1).Value <> "" Then
      hantei = True
     End If
   Else
     If NRng.Offset(1).Value <> "" And NRng.Offset(, 1).Value <> "" And NRng.Offset(, -1).Value <> "" Then
      hantei = True
     End If
   End If
  ElseIf NRng.Row = 65536 Then
   If NRng.Column = 1 Then
     If NRng.Offset(-1).Value <> "" And NRng.Offset(, 1).Value <> "" Then
      hantei = True
     End If
   ElseIf NRng.Column = 256 Then
     If NRng.Offset(-1).Value <> "" And NRng.Offset(, -1).Value <> "" Then
      hantei = True
     End If
   Else
     If NRng.Offset(-1).Value <> "" And NRng.Offset(, 1).Value <> "" And NRng.Offset(, -1).Value <> "" Then
      hantei = True
     End If
   End If
  Else
   If NRng.Column = 1 Then
     If NRng.Offset(, 1).Value <> "" And NRng.Offset(-1).Value <> "" And NRng.Offset(1).Value <> "" Then
      hantei = True
     End If
   ElseIf NRng.Column = 256 Then
    If NRng.Offset(, -1).Value <> "" And NRng.Offset(1).Value <> "" And NRng.Offset(-1).Value <> "" Then
      hantei = True
    End If
   Else
    If NRng.Offset(, -1).Value <> "" And NRng.Offset(, 1).Value <> "" And NRng.Offset(1).Value <> "" And NRng.Offset(-1).Value <> "" Then
      hantei = True
    End If
   End If
  End If
End Function

Function kei1()
  With r
   '左
   With .Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
   '右
   With .Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
  End With
End Function

Function kei2()
  With r
   '左
   With .Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
   '下
   With .Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
  End With
End Function

Function kei3()
  With r
   '右
   With .Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
   '下
   With .Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
  End With
End Function

Function kei4()
  With r
   '左
   With .Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
   '上
   With .Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
  End With
End Function

Function kei5()
  With r
   '右
   With .Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
   '上
   With .Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
  End With
End Function

Function kei6()
  With r
   '上
   With .Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
   '下
   With .Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
   End With
  End With
End Function
・ツリー全体表示

【78306】Re:Randomwalk
発言  β  - 16/6/23(木) 18:11 -

引用なし
パスワード
   ▼kinoko さん:

>プログラム初心者です。
>ランダムウォークを簡単な処理で作ってみました。

という割には、おもしろそうなことをしておられますね。

>ここから壁に跳ね返る処理

壁 とは 具体的にどこを想定されています?
PC画面に見えている範囲のことですか?

>色を変えていく処理

どんなように変化させていきたいですか?


ところで、このコード、すぐに行や列の番号が 0 になって、エラーで止まりませんか?
・ツリー全体表示

【78305】Randomwalk
質問  kinoko  - 16/6/23(木) 17:16 -

引用なし
パスワード
   プログラム初心者です。
ランダムウォークを簡単な処理で作ってみました。


Sub randomwalk1()

  Dim r As Integer
  Dim c As Integer
  Dim i As Integer
  
  ActiveSheet.Cells.Clear

  Randomize
  
  Cells.RowHeight = 5
  Cells.ColumnWidth = 0.5
  
  r = 50
  c = 50
  
  Cells(r, c).Select
  
  For i = 1 To 10000

    i = Int(9 * Rnd() + 1)

      If i = 1 Then

        r = r + 1
        c = c

        Cells(r, c).Interior.ColorIndex = 3

      ElseIf i = 2 Then

        r = r + 1
        c = c + 1

        Cells(r, c).Interior.ColorIndex = 3

      ElseIf i = 3 Then

        r = r
        c = c + 1

        Cells(r, c).Interior.ColorIndex = 3


      ElseIf i = 4 Then

        r = r - 1
        c = c + 1

        Cells(r, c).Interior.ColorIndex = 3


      ElseIf i = 5 Then

        r = r - 1
        c = c

        Cells(r, c).Interior.ColorIndex = 3

      ElseIf i = 6 Then

        r = r - 1
        c = c - 1

        Cells(r, c).Interior.ColorIndex = 3

      ElseIf i = 7 Then

        r = r
        c = c - 1

        Cells(r, c).Interior.ColorIndex = 3

      ElseIf i = 8 Then

        r = r + 1
        c = c - 1

        Cells(r, c).Interior.ColorIndex = 3

      Else

        r = r
        c = c

        Cells(r, c).Interior.ColorIndex = 3

      End If

  Next i

End Sub


ここから壁に跳ね返る処理と重なる部分の色を変えていく処理を追加したいのですが分かりません。簡単な処理でやってみたいです。お願いします。
・ツリー全体表示

【78304】Re:if公式を使ったsum
発言  kamikaya  - 16/6/21(火) 8:43 -

引用なし
パスワード
   ▼if.iserror さん:

みなさんがおっしゃる通りfor〜next文のを使った方がいいかと思います。

>しかし、全くの初心者のため、
>宿題として出された
>if公式の練習として1-10を(1.1)〜(10.1)のセルに埋め
>最後1-10をsumする方法が思いつきません。

スマホから書いてるので動作検証していませんがだいたい次のようになるはずです。

**********************

Sub test '起動するマクロの名前

  Dim i As Integer 'ループするための変数
  Dim Sum As Integer '合計値を格納するための変数

  For i = 1 to 10 'iが1から10になるまで以下を繰り返す(1周毎にiは1増える)
   Cells(i, 1).Value = i 'セル(i, 10)にiを記入する
   Sum = Sum + i 'Sumに毎回の合計を足していく
  Next 'for文の繰返しここまでの意

  Cells(11, 10).Value = Sum 'セル(11, 10)に上記の合計を記入する

End Sub 'マクロ"test"の終了

*********************

個人的にははじめに参考書で専門用語さえ覚えれば、あとはネットでなんとかなると思います(専門用語を知らないと検索さえできないので)。

マクロが組めれば効率が格段にアップするので是非この機会に勉強してみてください。
・ツリー全体表示

【78303】Re:if公式を使ったsum
お礼  [名前なし]  - 16/6/21(火) 7:58 -

引用なし
パスワード
   取り急ぎスマートフォンからお礼致します。
教えてもらいます。
社会常識がなく、申し訳ありませんでした。
・ツリー全体表示

【78302】Re:if公式を使ったsum
発言  β  - 16/6/21(火) 7:33 -

引用なし
パスワード
   ▼if.iserror さん:

連投失礼。

宿題に対するコード案、その先輩の頭にお中にあるであろう【模範解答】や
通常ならこう書くというコードを提示するのは難しくありません。

でも【宿題】としてだされたわけですよね。
自力で、そのコードが書けないなら、すなおに、できませんでしたといって
先輩から(先輩なりの)回答をもらうのがよろしいのでは?
・ツリー全体表示

【78301】Re:if公式を使ったsum
質問  β  - 16/6/21(火) 7:28 -

引用なし
パスワード
   ▼if.iserror さん:

γさんと同じ感想を持ちました。

かぞえ65なら、そんなに年寄りというわけではありませんけど、その世代って微妙で
実務的には(若いころ)、ゴリゴリのレガシーなプログラムを経験して、そのあとで
構造化プログラミングやオブジェクト指向が登場してきましたけど、それらの実務経験は少なく
頭の中での理解にとどまっている人が少なくありません。(かくいうβも、その一人ですが)

そういう人にとって、ループ制御は、GoTo なんですねぇ。
でも、基本の制御は For/Next や Do/Loop です。

職場の関係、しかも先輩でしょうから、波風たてるのはまずいでしょうから
γさんリコメンドの通り、参考書等での基本的な学習も是非併用してください。
・ツリー全体表示

【78300】Re:if公式を使ったsum
回答  γ  - 16/6/21(火) 7:19 -

引用なし
パスワード
   ▼if.iserror さん:
>if公式の練習として1-10を(1.1)〜(10.1)のセルに埋め
>最後1-10をsumする方法が思いつきません。
ifと余り関係無いように思いますけど。
むしろFor .. Nextによる繰り返しじゃないですか?
宿題はできなくて結構ですから、
その65歳さんに直接お聞きするのがよいと思います。

以下は、感想です。
>教えていただいているのは変数の設定の仕方、
>if,then,go toのみです。
goto は余り使わないし、
スパゲッティプログラムにならないよう、
できるだけgoto は使わないように、
というのが普通です。大丈夫かなあ。

併行して(閉口ではなく)基本的なテキストを購入して、
それを学習することをお勧めします。
こうしたところで、基本的な考え方に属する部分の説明を求めても
効率が悪いです。
・ツリー全体表示

【78299】if公式を使ったsum
質問  if.iserror  - 16/6/21(火) 6:54 -

引用なし
パスワード
   文系、経理業務で3年ほどエクセルの関数を触らせていただいているものです。

最近会社の数えで65歳の先輩と話す機会が増え、
昼休みにVBAを教えていただけることになりました。

しかし、全くの初心者のため、
宿題として出された
if公式の練習として1-10を(1.1)〜(10.1)のセルに埋め
最後1-10をsumする方法が思いつきません。

教えていただいているのは変数の設定の仕方、
if,then,go toのみです。
一応考えているのは(x.1)と設定する方法ですが、いい方法が思いつきません。
他にVBA使っている人に聞いてみると、「その方法ではうまくいかないだろう」とも言われています。

プログラマーの知り合いに聞いたところ、趣味で繋がっているのに、仕事関係の質問は失礼に感じる、そのため教えられないと言われ、こちらを紹介されました。

不躾ではありますが、どなたか、ご親切な方のお助けをいただけないでしょうか。
また、新参者ですので、掲示板上のマナーなどに反するところがあればお教えください(もう少し簡潔に書くなど)

宜しくお願いします。
・ツリー全体表示

【78298】Re:名称未定のテキストファイルの読込み方
お礼  macmac  - 16/6/17(金) 22:41 -

引用なし
パスワード
   ▼γ さま
お返事ありがとうございます。

所定のファイルの中にある文字"JAC"から始まる文字を見つけて
エクセルのセルE1に書き出す内容を作っております。

(所定のファイルは、C:\Tempに保存されているtxtファイルで名称は、日々更新されるものです。)


Sub Sample()
 Dim PartsID As String
 Dim i As Integer
 For i = 6 To 6 'Cells(Rows.Count, 3).End(xlUp).Row
 PartsID = Cells(i, 3)
 PartsID = Left(PartsID, 11)
 Debug.Print PartsID
 Call FileSearch("C:\Temp", PartsID & "*.txt")
   
 Next
End Sub

Sub FileSearch(Path As String, Target As String)
  Dim FSO As Object, Folder As Variant, File As Variant
  Dim strFILENAME As Variant
  Dim info As String
  Dim s As String
  Dim a As String
  Dim fNo As Integer
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  For Each Folder In FSO.GetFolder(Path).SubFolders
    Call FileSearch(Folder.Path, Target)
  Next Folder
  For Each File In FSO.GetFolder(Path).Files
    If File.Name Like Target Then
    strFILENAME = File.Path

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
   fNo = FreeFile
   s = "JAC"
   Debug.Print strFILENAME
   Open strFILENAME For Input As #fNo
   While Not EOF(1)
   Line Input #1, a
   If InStr(1, a, s) <> 0 Then
   info = Mid(a, 1, InStr(1, a, s) + 30)
   Debug.Print info
   End If
   Wend
   Close #fNo
    
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   End If
   Next File

   End Sub
・ツリー全体表示

【78297】Re:グラフを右クリック時のメニュー追加
発言  kamikaya  - 16/6/17(金) 21:05 -

引用なし
パスワード
   ▼kamikaya さん:

解決しました。
新規にグラフを追加した際にはNewChartイベントが発生するみたいなので次のように改良しました。

またNorthさんの追加したい項目が"調整"となっていましたが,これはグラフのサイズなどを調整するということでしょうか??
もしそうでしたらVectorでグラフ調整ソフト"GrapgAdjust"というものを配布しているので良ければ使ってみてください(ステマ(笑))

【Microsoft Excel Objects ThisWorkbook】

Option Explicit

Private WithEvents xApp As Application

'■アドインファイル(これ)が起動したとき…
Private Sub Workbook_Open()

  ' アドイン起動時、Applicationオブジェクトのイベントをキャッチ
  Set xApp = Me.Application
  
  '独自右クリックメニューの作成
  subSettingMyMenu
 
End Sub

'■既存のブックが開いたとき…
Private Sub xApp_WorkbookOpen(ByVal wb As Workbook)

  Dim Chrt As ChartObject
  Dim WS As Worksheet

  'グラフの割り当て
  For Each WS In wb.Worksheets
    For Each Chrt In WS.ChartObjects
      subChartEventSetting Chrt.Chart
    Next
  Next

End Sub

'■新規ブックが作成されたとき…(新規ブックにはグラフはないはずなので要らないかも)
Private Sub xApp_NewWorkbook(ByVal wb As Workbook)

  Dim Chrt As ChartObject
  Dim WS As Worksheet

  For Each WS In wb.Worksheets
    For Each Chrt In WS.ChartObjects
      subChartEventSetting Chrt.Chart
    Next
  Next

End Sub

'■新しくグラフが追加されたとき…
Private Sub xApp_WorkbookNewChart(ByVal wb As Workbook, ByVal Ch As Chart)

  'グラフの割り当て
  subChartEventSetting Ch
  
End Sub

【標準モジュール】

Option Explicit

Public MyMenu
Public MyMenu2
Private ChrtEvents As New Collection

'■グラフの割り当て
Public Sub subChartEventSetting(Ch As Chart)

   'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  Dim ChartEvent As New Class1
  Set ChartEvent.xChart = Ch
  ChrtEvents.Add ChartEvent

End Sub

'■独自右クリックメニューの作成
Public Sub subSettingMyMenu()

  Dim i As Integer

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"
      .OnAction = "subTest"
    End With
  End With
 
End Sub

'■最終的に実行したいマクロ
Private Sub subTest()

  MsgBox "Hello world"

End Sub

'■何らかの原因でイベント処理が割り当てられなかったとき用の手動割り当て
Sub 実行するマクロ()

  Dim Chrt As ChartObject
  Dim WS As Worksheet

  '独自右クリックメニューの作成
  subSettingMyMenu

  'グラフの割り当て
  For Each WS In ActiveWorkbook.Worksheets
    For Each Chrt In WS.ChartObjects
      subChartEventSetting Chrt.Chart
    Next
  Next
  
End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If

End Sub
・ツリー全体表示

【78296】Re:名称未定のテキストファイルの読込み方
回答  γ  - 16/6/17(金) 20:47 -

引用なし
パスワード
   Open strFILENAME For Input As #fNo
というのは、そのファイルにアクセスする権限を得た、
という感じのものです。

なにかのWIndowにテキストが表示されるというようなことを
期待していたとすると、その期待そのものが間違っています。

Input
Line Input などのステートメントでデータを取得する必要があります。

フォルダの配下にあるフォルダも含めて、各ファイルを開いて何をするか、
によって適切な"開く"手段を選ぶ必要があるでしょう。
・ツリー全体表示

【78295】Re:グラフを右クリック時のメニュー追加
質問  kamikaya  - 16/6/17(金) 15:18 -

引用なし
パスワード
   ▼kamikaya さん:

ちょっと加筆修正しました。

下記のコードはアドインファイルに記述します。既存のブックが開かれるたびにグラフの割り当てを自動的に行います。

ただし,これの問題はすでに開いているブックで新たにグラフを作成した場合,そのグラフには手動でイベント割り当てを行う必要があります(そのためのマクロ"実行するマクロ")。

逆質問で申し訳ないのですが,シート上でグラフが新規作成された場合にイベントを発生させる方法を知っている方がいらっしゃいましたらご教授のほどお願いします。

【Microsoft Excel Objects ThisWorkbook】

Option Explicit

Private WithEvents xApp As Application

'■アドインファイル(これ)が起動したとき…
Private Sub Workbook_Open()

  ' アドイン起動時、Applicationオブジェクトのイベントをキャッチ
  Set xApp = Me.Application
  
End Sub

'■既存のブックが開いたとき…
Private Sub xApp_WorkbookOpen(ByVal WB As Workbook)

  'グラフの割り当て
  subChartEventSetting WB

End Sub

【標準モジュール】

Option Explicit

Public MyMenu
Private ChrtEvents As New Collection

'■はじめに起動する場所
Sub 実行するマクロ()

  subChartEventSetting ActiveWorkbook

End Sub

'■グラフの割り当て
Public Sub subChartEventSetting(WB As Workbook)

  '独自右クリックメニューの作成
  subSettingMyMenu

  '独自右クリックメニューのグラフへの割り当て
  Dim CH As ChartObject
  Dim WS As Worksheet
  
  'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  For Each WS In WB.Worksheets
    For Each CH In WS.ChartObjects
      Dim ChartEvent As New Class1
      Set ChartEvent.xChart = CH.Chart
      ChrtEvents.Add ChartEvent
    Next
  Next

End Sub

'■独自右クリックメニューの作成

Private Sub subSettingMyMenu()

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"
      .OnAction = "subTest"
    End With
  End With
  
End Sub

'■最終的に実行したいマクロ

Private Sub subTest()

  MsgBox "Hello world"

End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If

End Sub
・ツリー全体表示

【78294】Re:グラフを右クリック時のメニュー追加
お礼  North  - 16/6/17(金) 14:45 -

引用なし
パスワード
   kamikayaさん
ご回答ありがとうございます。本当に助かります。
提示いただいたコードを参考にやってみます。
また不明点など出てきたら質問させていただきます。
・ツリー全体表示

【78293】Re:グラフを右クリック時のメニュー追加
発言  kamikaya  - 16/6/17(金) 14:36 -

引用なし
パスワード
   ▼North さん:

先ほども言ったように,グラフの既存の右クリックメニューへの追加はできませんが,以下のように独自の右クリックメニューを作成することはできます。

下記のコードをそれぞれのモジュールにコピーして,プロシージャ"実行するマクロ"を実行してみてください。

グラフ上で[Shift]キーを押しながら右クリックを押すことで独自右クリックメニュー(Test)がポップアップするようになっています。

※これでは各ブックで行わなくてはならないので,実装するならアドインファイルとした方が良いかと思います。

【Microsoft Excel Objects ThisWorkbook】

Private WithEvents xApp As Application

【標準モジュール】

Option Explicit

Public MyMenu
Private ChrtEvents As New Collection

'■はじめに起動する場所
Sub 実行するマクロ()

  '独自右クリックメニューの作成
  subSettingMyMenu

  '独自右クリックメニューのグラフへの割り当て
  Dim CH As ChartObject
  Dim WS As Worksheet
  
  'アクティブブック上のすべてのグラフに独自右クリックメニューを割り当てる
  For Each WS In ActiveWorkbook.Worksheets
    For Each CH In WS.ChartObjects
      Dim ChartEvent As New Class1 '"Class1"の箇所はクラスモジュールの名前と揃える
      Set ChartEvent.xChart = CH.Chart
      ChrtEvents.Add ChartEvent
    Next
  Next

End Sub

'■独自右クリックメニューの作成
Private Sub subSettingMyMenu()

  Set MyMenu = Application.CommandBars.Add(Position:=msoBarPopup, Temporary:=True)
  With MyMenu
    With .Controls.Add
      .Caption = "Test"     'そちらの"調整"に相当
      .OnAction = "subTest"   'そちらの"mAdj"に相当
    End With
  End With
  
End Sub

'■最終的に実行したいマクロ

Private Sub subTest()

  MsgBox "Hello world"

End Sub

【クラスモジュール(Class1)】

Option Explicit

Public WithEvents xChart As Chart
Dim Flag As Boolean

'■グラフ上でマウスボタンが押されたら…
Private Sub xChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

  If Button = 2 Then
    If Shift = 1 Then
      MyMenu.ShowPopup
    End If
  End If
  Flag = True

End Sub

'■グラフが右クリックされたら…
Private Sub xWorksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

  If Flag = True Then
    Cancel = True
    Flag = False
  End If

End Sub
・ツリー全体表示

207 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free