| 
    
     |  | ▼マナ さん: >▼westwindow さん:
 >
 >>1分かかる処理があるとして
 >
 >
 >どんな処理ですか。コードを提示できませんか。
 勤務表自動作成の処理の夜勤入力の部分です。宜しくお願い致します。
 
 
 Sub 夜勤総合入力3()  '山登り法による入力
 
 Range("本館全て").Select
 y1 = Selection(1).Row         '選択範囲の左上の行位置
 y2 = Selection(Selection.Count).Row  '選択範囲の右下の行の位置
 x1 = Selection(1).Column         '選択範囲の左上の列位置
 x2 = Selection(Selection.Count).Column   '選択範囲の右下の列の位置
 x4 = Range("勤務表左上").Column - 1 + Day(Range("月末日")) '月末列番号
 
 
 For x = x1 To x2
 Call 山登り法夜勤(x)
 Next x
 
 
 End Sub
 
 
 Sub 山登り法夜勤(x11) '列指定
 
 
 Dim 評価値1 As Single
 Dim 評価値2 As Single
 
 Dim a
 Dim b
 
 
 Randomize
 
 Randomize
 Range("ガレージ範囲").Select
 yg1 = Selection(1).Row         '選択範囲の左上の行位置
 yg2 = Selection(Selection.Count).Row  '選択範囲の右下の行の位置
 
 
 Range("職員と夜勤ガレージ").Select
 y11 = Selection(1).Row         '選択範囲の左上の行位置
 y22 = Selection(Selection.Count).Row  '選択範囲の右下の行の位置
 
 
 y60 = Range("ビット変数夜勤").Row   'チェックランの位置
 x60 = Range("ビット変数夜勤").Column
 
 y70 = Range("夜上限回数").Row   'チェックランの位置
 x70 = Range("夜上限回数").Column
 
 y80 = Range("夜総数").Row   'チェックランの位置
 x80 = Range("夜総数").Column
 
 
 For i = 1 To 2000               '★★理想数は不明
 
 
 'skip1:
 
 判定 = 0 '初期化する
 
 '初期セルを決める
 x1 = x11
 y1 = WorksheetFunction.RandBetween(y11, y22)
 
 x2 = x11
 y2 = WorksheetFunction.RandBetween(y11, y22)
 
 a = Cells(y1, x11)
 b = Cells(y2, x11)
 
 a_1 = Cells(y1, x11 + 1)
 a_2 = Cells(y1, x11 + 2)
 
 b_1 = Cells(y2, x11 + 1)
 b_2 = Cells(y2, x11 + 2)
 
 
 '-------ビット変数を用意する------
 
 If a = "夜ほ" Then
 a_bit = "100"
 End If
 If a = "夜鳥" Then
 a_bit = "010"
 End If
 If a = "夜花虹" Then
 a_bit = "001"
 End If
 If a = "" Then
 a_bit = "000"
 End If
 
 
 If b = "夜ほ" Then
 b_bit = "100"
 End If
 If b = "夜鳥" Then
 b_bit = "010"
 End If
 If b = "夜花虹" Then
 b_bit = "001"
 End If
 If b = "" Then
 b_bit = "000"
 End If
 
 ' ----------------交換できるか調べる
 
 aa =
 WorksheetFunction.Dec2Bin(WorksheetFunction.Bitand(WorksheetFunction.Bin2Dec
 (Cells(y1, x60)), WorksheetFunction.Bin2Dec(b_bit)), 3)
 bb =
 WorksheetFunction.Dec2Bin(WorksheetFunction.Bitand(WorksheetFunction.Bin2Dec
 (Cells(y2, x60)), WorksheetFunction.Bin2Dec(a_bit)), 3)
 If a_bit = "000" Then     '交換元が空白の時は、どこで
 も交換できる
 bb = "111"
 End If
 If b_bit = "000" Then
 aa = "111"
 End If
 If aa = "000" Or bb = "000" Then     '交換できないな
 らば戻る
 GoTo skip1
 End If
 
 
 '--------評価値1 -------------
 
 評価値1 = 夜勤総合評価(x11)
 
 If 評価値1 = 0 Then                  '評価
 1が0なら終了
 Exit Sub
 End If
 
 
 '----------交換------------
 Cells(y1, x1) = b
 Cells(y2, x1) = a
 
 
 '--------評価値2 -------------
 
 評価値2 = 夜勤総合評価(x11)
 
 '------------------------------------
 If Cells(y1, x80) > Cells(y1, x70) Or Cells(y2, x80) >
 Cells(y2, x70) Then  '上限数をこえていたら元に戻す
 
 Cells(y1, x1) = a
 Cells(y2, x1) = b
 End If
 
 
 If 評価値2 = 0 Then  '評価が0なら終了
 
 
 Exit Sub
 End If
 
 
 If 評価値2 < 評価値1 Then '評価が悪いと元に戻す
 
 
 Cells(y1, x1) = a
 Cells(y2, x1) = b
 End If
 
 skip1:
 
 
 Next i
 
 End Sub
 
 |  |