アプリ版:「スタンプのみでお礼する」機能のリリースについて

表のAC5~AV262に1~50迄の値がランダムに入っており、
このAC5~AV5に1~50の値が最も多く入っている1~50の値を取り出しDM5に表示したいのです。
そしてAC5~AV5からAC262~AV262迄、行ごとにDM5~DM262に表示したいのです。

VBA初心者なので色々、何度もやってみても出来ません。
どなたか教えて頂ければと思い投稿しました、宜しくお願いします。

A 回答 (3件)

あっ!


行単位の最大値も必要でしたら定義に
Dim tblLine(50) As Integer
を追加して
tblCnt(.Cells(intR, intC).Value) = tblCnt(.Cells(intR, intC).Value) + 1
の下に
tblLine(.Cells(intR, intC).Value) = tblLine(.Cells(intR, intC).Value) + 1
を追加して
Next intC
の下で値設定して初期化すれば良いでしょう
ややこしくなってきたので修正したコードを再度記載しておきます
--------------------------------------------------------------------------------
Sub Sample()
  Dim intR    As Integer
  Dim intC    As Integer
  Dim tblCnt(50) As Integer
  Dim tblLine(50) As Integer
  Dim intL    As Integer
  Dim intZ    As Integer
  Dim intI    As Integer
  
  With Sheet1
    For intR = 5 To 262
      For intC = 29 To 48
        tblCnt(.Cells(intR, intC).Value) = tblCnt(.Cells(intR, intC).Value) + 1
        tblLine(.Cells(intR, intC).Value) = tblLine(.Cells(intR, intC).Value) + 1
      Next intC
      
      intL = 0
      intZ = 0
      For intI = 1 To 50
        If intL < tblLine(intI) Then
          intZ = intI
          intL = tblLine(intI)
        End If
      Next intI
      
      .Cells(intR, 117).Value = intZ
      Erase tblLine
      
    Next intR
    
    intL = 0
    intZ = 0
    For intR = 1 To 50
      If intL < tblCnt(intR) Then
        intZ = intR
        intL = tblCnt(intR)
      End If
    Next intR
    
    .Cells(263, 117).Value = intZ
  End With
  
End Sub
--------------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

丁寧にありがとうございます。

お礼日時:2019/06/25 16:55

一番多く使われている数が知りたいという事ですね!


ではMODE関数を使ってみて下さい。ただし同率一位が複数ある場合には適切な解にはならないと思います。
VBAを使うのであれば出現数をテーブルに退避していきカウンタを設けて加算していけば出来ますね。
Sub Sample()
  Dim intR As Integer
  Dim intC As Integer
  Dim tblCnt(50) As Integer
  Dim intL As Integer
  Dim intZ As Integer
  
  With Sheet1
    For intR = 5 To 262
      For intC = 29 To 48
        tblCnt(.Cells(intR, intC).Value) = tblCnt(.Cells(intR, intC).Value) + 1
      Next intC
    Next intR
  End With
  
  intL = 0
  intZ = 0
  For intR = 1 To 50
    If intL < tblCnt(intR) Then
      intZ = intR
      intL = tblCnt(intR)
    End If
  Next intR
  
  MsgBox "最大出現は『" & intZ & "』出現数は『" & intL & "』でした"
  
End Sub
こちらはサンプルですが、最後のMsgboxの分を該当セルに設定すれば良いですよ♪
    • good
    • 0
この回答へのお礼

ありがとうございます。初心者で申し訳ありませんでした

お礼日時:2019/06/25 16:56

>このAC5~AV5に1~50の値が最も多く入っている1~50の値を取り出し


どういうことでしょうか?
最大値を取得したいという事でしょうか?
だとすると
DM5:=MAX(AC5:AV5)
でいけると思うのですがCOUNTIFを使って何を行っているのでしょう?

またカテゴリが全く違いますので変更をお薦めします。
回答が付きやすいと思いますよ。
    • good
    • 0
この回答へのお礼

すみません、カテゴリを考えてませんでした。
AC5~AV5の表に1~50の値の中で一番多く出ている数字をDM5に表示
AC6~AV6の表に1~50の値の中で一番多く出ている数字をDM6に表示
           |
AC262~AV262の表に1~50の値の中で一番多く出ている数字をDM262に表示
上記をVBAでやってみたのですが上手く出来ませんでした。

お礼日時:2019/06/25 15:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!