VBA演習

###Q1
Sub Q1計算③()
    
    Dim i As Long
    Dim maxrow As Long
    
    maxrow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To maxrow
    
        'Cells(i, "C").Value.Formula = "=PRODUCT($F$2:"
        Cells(i, "C").Formula = "=PRODUCT(B1:B" & i & "+1)-1"
        
    Next i

End Sub

###Q2
Sub FizzBuzz()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")  ' シート名を適切に設定してください。
    Dim i As Integer

    For i = 1 To 100  ' A1からA100までの範囲
        Dim value As Integer
        value = ws.Cells(i, 1).Value  ' A列の値を取得

        ' 15の倍数を先に確認（3の倍数かつ5の倍数）
        If value Mod 15 = 0 Then
            ws.Cells(i, 2).Value = "Fizz Buzz"
        ' 3の倍数を確認
        ElseIf value Mod 3 = 0 Then
            ws.Cells(i, 2).Value = "Fizz"
        ' 5の倍数を確認
        ElseIf value Mod 5 = 0 Then
            ws.Cells(i, 2).Value = "Buzz"
        Else
            ws.Cells(i, 2).Value = ""  ' 該当しない場合は空欄
        End If
    Next i
End Sub

###Q3

' 都道府県名を抜き出す関数
Function KEN(mystr As String) As String
    Dim mykey As String
    Dim mylen As Integer
    
    '先頭から 4 番目の数を抜き出します
    mykey = Mid(mystr, 4, 1)
    
    ' 4 番目の数が「県」である場合
    If mykey = "県" Then
        mylen = 4
        
    ' それ以外の場合（「都」「道」「府」）
    Else
        mylen = 3
        
    End If
    
    ' 都道府県名を取り出します
    KEN = Left(mystr, mylen)
    
End Function

' 市区町村名を抜き出す関数
Function SHI(mystr As String) As String
    
    Dim i As Integer
    
    ' 都道府県名以降の文字列を取り出します（例：新宿区西新宿1-1-1）
    mystr = Right(mystr, Len(mystr) - Len(KEN(mystr)))
    
    ' 文字列内に「市」「区」「郡」「町」「村」があるかどうか調べます（例：「区」）
    For i = 0 To UBound(Array("市", "区", "郡", "町", "村"))
        
        ' 見つかった場合（例：「新宿区」）
        If InStr(1, mystr, Array("市", "区", "郡", "町", "村")(i)) > 0 Then
            
            ' 市区町村名を取り出します（例：「新宿区」）
            SHI = Left(mystr, InStr(1, mystr, Array("市", "区", "郡", "町", "村")(i)))
            
            Exit For
            
        End If
        
     Next i
     
End Function

###Q4
Function 素因数分解(n As Long) As String
    Dim i As Long
    Dim factor As String
    factor = ""
    
    ' 2 で割れる限り割る
    Do While n Mod 2 = 0
        factor = factor & "2 * "
        n = n / 2
    Loop
    
    ' 3 以上の奇数で割る
    i = 3
    Do While i * i <= n
        If n Mod i = 0 Then
            factor = factor & i & " * "
            n = n / i
        Else
            i = i + 2
        End If
    Loop
    
    ' 最後の素因数を追加
    If n > 1 Then
        factor = factor & n & " * "
    End If
    
    ' 最後の "* " を削除して結果を返す
    If Len(factor) > 0 Then
        素因数分解 = Left(factor, Len(factor) - 3)
    Else
        素因数分解 = ""
    End If
End Function

Sub 素因数分解記入()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    Dim i As Long
    For i = 2 To lastRow
        If IsNumeric(ws.Cells(i, "A").Value) And ws.Cells(i, "A").Value > 0 Then
            ws.Cells(i, "B").Value = 素因数分解(ws.Cells(i, "A").Value)
        Else
            ws.Cells(i, "B").Value = "非数値または負の値"
        End If
    Next i
End Sub

###Q5
###Q6

Sub データ転記()
    Dim sourcePath As String
    Dim sourceWorkbook As Workbook
    Dim targetSheet As Worksheet
    
    ' 現在のワークブックのパスを取得
    sourcePath = ActiveWorkbook.Path & "\Data.xlsx"
    
    ' ソースファイルを開く
    Set sourceWorkbook = Workbooks.Open(sourcePath)
    
    ' ソースブックのデータを全てコピー
    sourceWorkbook.Sheets(1).Cells.Copy
    
    ' "作業"シートにデータを貼り付け
    Set targetSheet = ThisWorkbook.Sheets("作業")
    targetSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteAll
    
    ' ソースワークブックを閉じる
    sourceWorkbook.Close SaveChanges:=False

    ' クリップボードをクリア
    Application.CutCopyMode = False
End Sub