Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Sub Roulette()
Dim ch As Chart
Set ch = Worksheets("ルーレット").ChartObjects("グラフ 1").Chart
Dim startN As Long, lastN As Long
startN = ch.ChartGroups(1).FirstSliceAngle
lastN = Int((360 + 1) * Rnd) + 360 * 6
Dim n As Long
n = startN
Do While n < lastN
DoEvents
ch.ChartGroups(1).FirstSliceAngle = n Mod 360
Sleep 5
If lastN - n > 360 * 3 Then
n = n + 10
Else
n = n + 10 - Int((n - 360 * 3) / (lastN - 360 * 3) * 10)
End If
Loop
End Sub
では、コードについて解説していきます。 ※複雑なコードのため簡単に解説します。
Option Explicit
変数宣言を強制する際に記述するものです。 変数宣言を省略したい場合は、記述する必要はありません。
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Windows APIにある「Sleep」というプロシージャを使えるようにするための宣言です。
Dim ch As Chart
Set ch = Worksheets("ルーレット").ChartObjects("グラフ 1").Chart
Dim startN As Long, lastN As Long
startN = ch.ChartGroups(1).FirstSliceAngle
lastN = Int((360 + 1) * Rnd) + 360 * 6
DoEvents
ch.ChartGroups(1).FirstSliceAngle = n Mod 360
Sleep 5
If lastN - n > 360 * 3 Then
n = n + 10
Else
n = n + 10 - Int((n - 360 * 3) / (lastN - 360 * 3) * 10)
End If
Sub ToggleSheetView()
Dim ws As Worksheet
Set ws = Worksheets("設定")
Dim m As Long
m = Month(Date)
Dim ckRng As Range
Set ckRng = ws.Range("B3")
ckRng.Value = Not ckRng.Value
Dim i As Long
For i = 1 To 12
On Error Resume Next
With Worksheets(i & "月")
If i = m Or ckRng.Value Then
.Visible = xlSheetVisible
Else
.Visible = xlSheetHidden
End If
End With
On Error GoTo 0
Next i
ws.Activate
End Sub
では、コードについて解説していきます。
Dim ws As Worksheet
Set ws = Worksheets("設定")
Dim m As Long
m = Month(Date)
Dim oldValue As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.CountLarge = 1 And _
Target.Row >= 2 And _
Target.Column <= 3 Then
With Worksheets("変更履歴")
.Rows(2).Insert CopyOrigin:=xlFormatFromRightOrBelow
.Range("A2").Value = Now
.Range("B2").Value = Target.Address(False, False)
.Range("C2").Value = oldValue
.Range("D2").Value = Target.Value
End With
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge = 1 Then
oldValue = Target.Value
End If
End Sub
では、コードについて解説していきます。
Private Sub Worksheet_Change(ByVal Target As Range)
'省略
End Sub
Dim oldValue As Variant
'省略
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge = 1 Then
oldValue = Target.Value
End If
End Sub
With Worksheets("変更履歴")
.Rows(2).Insert CopyOrigin:=xlFormatFromRightOrBelow
.Range("A2").Value = Now
.Range("B2").Value = Target.Address(False, False)
.Range("C2").Value = oldValue
.Range("D2").Value = Target.Value
End With