変異体のRSメモ帳

B鯖のレベリング勢じゃない狩り専の落書き

VBA / GAS

メイン(VBA

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Const staterng As String = "C3:C33" '状態列
    Const seirng As String = "K3:K33" '性向列
    
    '現在時刻取得とフォーマット
    Dim daytime As Date
    daytime = Now
    Dim nowtime As String
    nowtime = Format(daytime, "yyyy/mm/dd HH:MM")
    
    '情報更新箇所取得
    Dim trow As Variant
    trow = ActiveCell.Row '選択行
    Dim account As Variant
    account = Cells(trow, 1).Interior.Color 'アカウントカラー
    Dim ccol As Variant
    ccol = RGB(192, 80, 77) 'チェックカラー
    
    Dim i As Integer
    
    '性向ゲージ再計算処理
    If Not Application.Intersect(Target, Range(seirng)) Is Nothing Then
        '性向取得
        Dim seikou As Integer
        seikou = Target.Value
        
        '塗りつぶしマス数計算
        Dim masu As Variant
        masu = Application.WorksheetFunction.RoundUp(seikou / -16, 0)
        masu = masu + 3
        
        '塗りつぶし処理
        For i = 4 To 10
            Cells(trow, i).Interior.Color = account
        Next
        For i = 4 To masu
            Cells(trow, i).Interior.Color = ccol
        Next
        Cancel = True
        
    '状態による計算処理
    ElseIf Not Application.Intersect(Target, Range(staterng)) Is Nothing Then
        '状態取得
        Dim state As String
        state = Target.Value
        
        '状態の値による処理分岐
        Select Case state:
            Case "かけら出し" '現在時刻と更新日時を比較し更新できるか判定
                Dim kousin As Date
                kousin = Cells(trow, 2).Value '更新日時
                If nowtime >= kousin Then
                    Target.Value = "更新可"
                Else
                    Target.Value = "更新待ち"
                End If
                
            Case "更新可" '次回更新日時更新処理
                Target.Value = "報酬交換"
                Dim kousintime As Date
                kousintime = DateAdd("d", 7, nowtime)
                kousintime = DateAdd("n", 1, kousintime)
                Cells(trow, 2).Value = kousintime
                
            Case "報酬交換" '性向更新処理
                Target.Value = "かけら出し"
                
                '性向数字入力欄が空でなければ処理する
                If Not Cells(trow, 11).Value = "" Then
                    '最初に性向-100か調べる
                    Dim gauge As Variant
                    gauge = Cells(trow, 10).Interior.Color 'ゲージ7マス目
                    
                    If gauge = ccol Then '性向-100なら
                        For i = 4 To 10
                            Cells(trow, i).Interior.Color = account 'ゲージリセット
                        Next
                        Cells(trow, 11).Value = 0 '性向0にセット
                    Else '性向-100以外なら
                        For i = 4 To 10
                            gauge = Cells(trow, i).Interior.Color '性向ゲージiマス目
                            If Not gauge = ccol Then '色が違うなら
                                Cells(trow, i).Interior.Color = ccol '1マス塗りつぶし
                                Cells(trow, 11).Value = (i - 3) * -16 '性向数値計算
                                If Cells(trow, 11).Value < -100 Then '-100以下になったら-100にする
                                    Cells(trow, 11).Value = -100
                                End If
                                Exit For '更新処理終了
                            End If
                        Next
                    End If
                End If
        End Select
        Cancel = True
    End If
End Sub


更新待ち評価処理(VBA

Sub Reload()
    
    Dim daytime As Date
    daytime = Now
    Dim nowtime As String
    nowtime = Format(daytime, "yyyy/mm/dd HH:MM")
    Range("B1").Value = nowtime
    
    Dim i As Long
    i = 3
    
    Do While Cells(i, 1) <> ""
        If Cells(i, 3) = "更新待ち" Then
            If daytime >= Cells(i, 2) Then
                Cells(i, 3) = "更新可"
            End If
        End If
        i = i + 1
    Loop
    
End Sub


メイン(GAS)
Syntax highlightingはGASがない?ためjavascript

function kakera_kousin() {
  //active get
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spread.getActiveSheet();
  var cell = sheet.getActiveCell();
  
  //現在時刻取得
  var nowtime = Moment.moment();
  
  //active cellの情報取得
  var row = cell.getRow();
  var column = cell.getColumn();
  var color = cell.getBackground();
  
  //状態を更新するか、性向ゲージを再描写するか列rangeでスイッチ
  //3:状態、11:ゲージ再描写
  switch(column){
    //状態更新
    case 3:
      //現在の状態を取得
      var state = cell.getValue();
      
      //状態に合わせて処理スイッチ
      switch(state){
        case "かけら出し": //現在時刻と更新日時を比較して更新できるか判定する
          //更新日時獲得(js Date type)
          var kousin = sheet.getRange(row, 2).getValue();
          //js Date type -> moment type
          kousin = Moment.moment(kousin);
          //更新可能か判定して状態を更新
          if(kousin.isBefore(nowtime)){
            cell.setValue("更新可");
          }else{
            cell.setValue("更新待ち");
          }
          break;
          
        case "更新可": //次回更新日時を計算して更新
          //状態更新
          cell.setValue("報酬交換");
          //次回更新日時計算用の現在時刻を取得
          var kousintime = Moment.moment();
          //今から7日と1分後を加算
          kousintime.add(7, "d"); //7day
          kousintime.add(1, "m"); //1minute
          //更新日時列のrangeをとって値を置き換える
          sheet.getRange(row, 2).setValue(kousintime.format("YYYY/MM/DD HH:mm"));
          break;
          
        case "報酬交換": //性向ゲージの変動を計算して反映
          //状態更新
          cell.setValue("かけら出し");
          //性向数値部分のrangeをあらかじめとっとく
          var range11 = sheet.getRange(row, 11);
          //性向数値が空白(天上通い)か判定
          if(range11.isBlank()){
            break; //天上通いなら処理終了
          }else{
            //性向-100か判定
            if(range11.getValue() == "-100"){
              //ゲージをリセット
              sheet.getRange("D" + row + ":J" + row).setBackground(color);
              //性向数値を0にセット
              range11.setValue(0);
              break;
            }else{ //性向-100以外なら
              //ゲージの背景色取得
              var gauge = sheet.getRange("D" + row + ":J" + row).getBackgrounds();
              for(var i = 4; i <= 10; i++){
                //ゲージ背景色とアカウント背景色が同じになったら
                if(gauge[0][i-4] == color){
                  //1マス塗る
                  sheet.getRange(row, i).setBackgroundRGB(192,80,77);
                  //性向数値を計算する
                  var si = (i - 3) * -16;
                  //-100以下になったら-100に合わせる
                  if( si < -100){
                    si = -100;
                  }
                  //性向数値更新
                  range11.setValue(si);
                  break;
                }
              }
            }
          }
      }
      break;
          
    case 11: //性向ゲージ再描写
      //現在の性向数値取得
      var seikou = cell.getValue();
      //塗りつぶすマス数を計算
      var masu = Math.ceil(seikou / -16) -1;
      //columnを変換
      var ca = ["D", "E", "F", "G", "H", "I", "J"];
      //ゲージをリセット
      sheet.getRange("D" + row + ":J" + row).setBackground(color);
      //塗りつぶし処理
      sheet.getRange("D" + row + ":" + ca[masu] + row).setBackgroundRGB(192,80,77);
      break;
  }
}


更新待ち評価処理(GAS)

function onOpen(){
  //active get
  var spread = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spread.getActiveSheet();
  
  //現在時刻取得
  var time = Moment.moment();
  //B1を更新
  sheet.getRange("B1").setValue(time.format("YYYY/MM/DD HH:mm"));
  
  //全員の状態を取得
  var range = sheet.getRange("C3:C39").getValues();
  
  //更新待ちを探索
  for(var i = 0; i < range.length; i++){
    if(range[i][0] == "更新待ち"){
      //rowを設定する
      var row = i + 3;
      //次回更新日時を取得
      var kousin = sheet.getRange(row, 2).getValue();
      kousin = Moment.moment(kousin);
      
      //更新できるか判定
      if(kousin.isBefore(time)){
        sheet.getRange(row, 3).setValue("更新可");
      }
    }
  }
}