|    | 
     ▼Yoshi さん: 
>現在写真96点を写真にp (1)〜p (96)のナンバーを振って、エクセルシート上に 
>セルを一つ飛びに挿入・貼り付けています。 
>写真の連番には順調に貼り付けられるのですが、 
>rand関数を入れて、毎回写真の出るセル位置を変えたいのですが 
1 〜 96 を配列に入れて randamにします。 
その配列の中身を指定すれば宜しいかと。 
尚、検証していないのでバグがあるかもしれません。 
 
Sub Photo_Paste() 
  Dim m As Long, n As Long, p As Long 
  Dim CC As Long, RR As Long 
  Dim R As Range, SP As Shape, WS As Worksheet, FileName As String 
' ***** 下記を追加 
  Const num      As Long = 96 
  Dim sN(1 To num)  As Variant 
  Dim i        As Long 
  SetArray sN, num 
' ***** 此処まで 
 
  Application.ScreenUpdating = False 
   
  On Error Resume Next 
  With Sheets("Sheet1") 
    .Activate 
    For n = 1 To 97 
      .Rectangles("myPicture" & n).Delete 
    Next n 
    'On Error GoTo 0 
     
    Set WS = Application.ActiveSheet 
    p = 1 
    m = 1 
    For RR = 2 To 12 Step 2 
      For CC = 2 To 32 Step 2 
        Set R = .Cells(RR, CC) 
        With R 
          Set SP = Sheets("Sheet1").Shapes.AddShape(msoShapeRectangle, _ 
          .Left, .Top, 39, 38)  ''''' 
          FileName = _ 
 ThisWorkbook.Path & "\photo\" & "P" & " " & "(" & sN(p) & ")" & ".jpg" 
                          -----此処を変更 
          SP.Fill.UserPicture FileName 
          On Error GoTo 0 
        End With 
        p = p + 1 
        If p >= 98 Then 
          Exit Sub 
        End If 
        m = m + 1 
        SP.Name = "myPicture" & m - 1 
        SP.Line.ForeColor.RGB = RGB(0, 0, 0) 
        SP.Line.Weight = 1.5 
      Next CC 
    Next RR 
    Set SP = Nothing: Set R = Nothing: Set WS = Nothing 
  End With 
  Application.ScreenUpdating = True 
End Sub 
 
Sub SetArray(sN() As Variant, n As Long) 
  Dim i    As Long 
  Dim tmp   As String 
  Dim lRnd  As Long 
  For i = 1 To n 
    sN(i) = i 
  Next 
  Randomize 
  For i = n To 2 Step -1 
    lRnd = Int(i * Rnd) + 1 
    tmp = sN(i) 
    sN(i) = sN(lRnd) 
    sN(lRnd) = tmp 
  Next 
End Sub 
 | 
     
    
   |