Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


232 / 3841 ページ ←次へ | 前へ→

【77820】msgboxでシートを指定する方法
質問  ゆうすけ  - 16/1/2(土) 2:03 -

引用なし
パスワード
   msgboxで「Aというファイルを開いてください」・・・1.
さらに「Bというシートを選択してください」・・2.
としたいです。

1.は
MsgBox "「A」を開いてください"
  Dim OpenFileName As String
  OpenFileName = Application.GetOpenFilename
   If OpenFileName <> "False" Then
    Workbooks.Open OpenFileName
  Else
    MsgBox "キャンセルされました"
    ThisWorkbook.Close False
  End If

End Sub
で思うような形になりました。

2.(シート)を1.と同じように選択する方法はありますか。
・ツリー全体表示

【77819】Re:点数のランキング
発言  マナ  - 15/12/31(木) 23:08 -

引用なし
パスワード
   ▼まさひで さん:

1)データを1個ずつ辞書に登録
2)新規シートに登録結果を書き出し
3)回数の多い順に並べ替え
4)回数の多いものトップ5でフィルター

Sub test()
  Dim dic As Object
  Dim c As Range
  
  Set dic = CreateObject("scripting.dictionary")
  
  For Each c In Range("a1").CurrentRegion   '★データ範囲
    dic(c.Value) = dic(c.Value) + 1
  Next
  
  With Worksheets.Add
    .Range("a1:b1").Value = Array("番号", "回数")
    .Range("a2").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys)
    .Range("b2").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.items)
    
    With .Range("a1").CurrentRegion
      .Sort Key1:=.Columns(2), Order1:=xlDescending, Header:=xlYes
      .AutoFilter Field:=2, Criteria1:="5", Operator:=xlTop10Items
    End With
  End With

End Sub
・ツリー全体表示

【77818】Re:至急お願い致します。
発言  β  - 15/12/31(木) 17:04 -

引用なし
パスワード
   ▼かん さん:

専門家さんならスマートかつすっきりした組み立てになると思いますが
泥臭く、積み木細工のように書けば

=QUOTIENT(A1,100)*100+MOD(A1,10)+MOD((A1-QUOTIENT(A1,100)*100-MOD(A1,10))+10,100)

とか。
・ツリー全体表示

【77817】点数のランキング
質問  まさひで  - 15/12/31(木) 14:53 -

引用なし
パスワード
   ロト6のデータベースを作成しています。過去の当選番号の6個数字を全て入力して、あるセルに当選の多かった数字ランキングベスト5と、それが何回当選されたのかを表示させたいのですが、何分にもかじりはじめで、ほとんど知識がなく分かりません。教えてくだされば幸いです。
・ツリー全体表示

【77816】Re:VBA素人です。至急お願いいたします。
お礼  kenkyu-sya  - 15/12/30(水) 17:22 -

引用なし
パスワード
   βさん

本を何冊か買ってきて、VBAの使い方を勉強している
最中です。

午前中は、エクセルのVBAをうまく使うことができなかったのですが
やっと少し理解できました。

βさんに作成していただいたものでうまく
作業できました。

本当にありがとうございました。
今後もどうかよろしくお願いいたします。
・ツリー全体表示

【77814】Re:至急お願い致します。
お礼  かん  - 15/12/30(水) 15:06 -

引用なし
パスワード
   ▼β さん:
>▼かん さん:
>
>単純に 10 を足しちゃだめなんですか?
>10の位はアップさせても、繰り上がりはさせず、100の位はそのままという要件ですか?

返信ありがとうございます。
そうです。一の位や百の位の数字は変えずに、10のくらいを繰り上げです。
位というか、下2桁目をひとつ繰り上げといったイメージです。
・ツリー全体表示

【77813】Re:至急お願い致します。
発言  β  - 15/12/30(水) 15:01 -

引用なし
パスワード
   ▼かん さん:

単純に 10 を足しちゃだめなんですか?
10の位はアップさせても、繰り上がりはさせず、100の位はそのままという要件ですか?
・ツリー全体表示

【77812】至急お願い致します。
質問  かん  - 15/12/30(水) 13:39 -

引用なし
パスワード
   エクセルで、任意の桁数を繰り上げしたいのですが、そういった関数はあります
でしょうか。


3322501   3322511
3322601  →3322611
3322711   3322721

10のくらいのみをひとつ繰り上げて、一の位はそのままにしたいのですが。
よろしくお願いいたします。
・ツリー全体表示

【77811】Re:VBA素人です。至急お願いいたします。
発言  β  - 15/12/30(水) 12:36 -

引用なし
パスワード
   ▼kenkyu-sya さん:

もう1つ。
アップされたレイアウト、"USERID" が A1、"問5" が F1 という前提です。
・ツリー全体表示

【77810】Re:VBA素人です。至急お願いいたします。
発言  β  - 15/12/30(水) 12:34 -

引用なし
パスワード
   ▼kenkyu-sya さん:

>すぐに試してみたのですが、うまく実行できておりません。

具体的には、どのような不具合があったのでしょうか?

>具体的には、コピーアンドペーストをしたシートの実行と
>保存がうまくいっていません。

この意味がよくわかりません。

いずれにしてもアップしたコードは標準モジュールというところに書きます。
また、実行時には変換しようとしているシートを表示して実行することを前提にしています。
・ツリー全体表示

【77809】Re:VBA素人です。至急お願いいたします。
発言  β  - 15/12/30(水) 11:49 -

引用なし
パスワード
   ▼kenkyu-sya さん:

アップ済みのコードと基本かわりませんが、処理効率を若干あっぷさせたものも参考までに。

Sub Test2()
  Dim r As Range
  Dim a As Range
  Dim f As Range
  Dim t As Range
  
  Application.ScreenUpdating = False
  
  With Range("A1").CurrentRegion
    With .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1)
      For Each r In .Rows
        On Error Resume Next
        Set a = r.SpecialCells(xlCellTypeConstants)
        On Error GoTo 0
        If Not a Is Nothing Then
          If a.Areas.Count > 1 Then
            Set f = a.Areas(1).Cells(1)
            Set t = a.Areas(a.Areas.Count).Cells(a.Areas(a.Areas.Count).Cells.Count)
            Range(f, t).Value = f.Value
          End If
        End If
      Next
    End With
  End With
End Sub
・ツリー全体表示

【77808】Re:VBA素人です。至急お願いいたします。
お礼  kenkyu-sya  - 15/12/30(水) 11:49 -

引用なし
パスワード
   βさん

お忙しい中レスをいただきありがとうございました。

すぐに試してみたのですが、うまく実行できておりません。
素人ですのでもう少しお時間をもらえればと思います。
具体的には、コピーアンドペーストをしたシートの実行と
保存がうまくいっていません。
またうまくいきましたらお返事させていただこうとおもいます。

ありがとうございました。


▼β さん:
>▼kenkyu-sya さん:
>
>質問に回答をもらってからのほうがいいかとも思いますが、推測で。
>
>Sub Test()
>  Dim r As Range
>  Dim a As Range
>  Dim f As Range
>  Dim t As Range
>  With Range("A1").CurrentRegion
>    With .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1)
>      For Each r In .Rows
>        On Error Resume Next
>        Set a = r.SpecialCells(xlCellTypeConstants)
>        On Error GoTo 0
>        If Not a Is Nothing Then
>          Set f = a.Areas(1).Cells(1)
>          Set t = a.Areas(a.Areas.Count).Cells(a.Areas(a.Areas.Count).Cells.Count)
>          Range(f, t).Value = f.Value
>        End If
>      Next
>    End With
>  End With
>End Sub
・ツリー全体表示

【77807】Re:VBA素人です。至急お願いいたします。
回答  kenkyu-sya  - 15/12/30(水) 11:10 -

引用なし
パスワード
   返信ありがとうございます


>問1と問3と問5に回答していればどういった結果になりますか?
まれにこういうことはあると思うのですが、問2と問4は回答しているという
扱いにします。

>また、これは、こちらがとやかくいうことではありませんけど
>本当に、問1と問5だけに回答。 問2〜問4は未回答だったということはないのでし>ょうかねぇ?
そうなんです。未回答で空白扱いになっております。
しかし、今回は、こういうオセロみたいに挟んだものだけは回答したものとして
扱いたいのです。

今からいただいたレスを使ってみようと思います。

お忙しいところ、レスありがとうございました。
・ツリー全体表示

【77806】Re:VBA素人です。至急お願いいたします。
発言  β  - 15/12/30(水) 10:48 -

引用なし
パスワード
   ▼kenkyu-sya さん:

質問に回答をもらってからのほうがいいかとも思いますが、推測で。

Sub Test()
  Dim r As Range
  Dim a As Range
  Dim f As Range
  Dim t As Range
  With Range("A1").CurrentRegion
    With .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 1)
      For Each r In .Rows
        On Error Resume Next
        Set a = r.SpecialCells(xlCellTypeConstants)
        On Error GoTo 0
        If Not a Is Nothing Then
          Set f = a.Areas(1).Cells(1)
          Set t = a.Areas(a.Areas.Count).Cells(a.Areas(a.Areas.Count).Cells.Count)
          Range(f, t).Value = f.Value
        End If
      Next
    End With
  End With
End Sub
・ツリー全体表示

【77805】Re:VBA素人です。至急お願いいたします。
発言  β  - 15/12/30(水) 10:38 -

引用なし
パスワード
   ▼kenkyu-sya さん:

仮に 問1と問3と問5に回答していればどういった結果になりますか?

また、これは、こちらがとやかくいうことではありませんけど
本当に、問1と問5だけに回答。 問2〜問4は未回答だったということはないのでしょうかねぇ?
・ツリー全体表示

【77804】VBA素人です。至急お願いいたします。
質問  kenkyu-sya  - 15/12/30(水) 9:58 -

引用なし
パスワード
   至急のため、ヤフーの知恵袋にも同じような質問をしていることをご了承くださいませ。

VBA素人なのでご指導お願いします。

至急、しなければならない仕事が舞い込んでまいりました。

具体的には、アンケートデータなのですが、空白、つまり欠損している部分を補うという作業です。
ユーザーが問1から問5まで回答するというデータで、回答していれば表にユーザーIDを書きこんでいます。しかし、欠損値が多いため、その欠損している部分は、一定のルールをもって埋めることになりました。

エクセルで表を作成しており、添付してはいますが、実際は1000人規模のデータを扱わなければなりません。手作業ではミスを連発しそうなので条件式などを駆使してみましたがうまくいきません。知人にきくと、VBAでないと難しいのではないかと教えてくれました。

ルールなのですが、表でしめしておりますように、例えばUSER101は、問1と問5を回答していますが、欠損値の変換で問2,3,4も回答したこととみなす、としたいのです。

表にありますように、 「問い」と「問い」の間の「問い」が欠損しているものについて、USERが回答したとみなす、つまり、「問い」に挟まれた「問い」についてだけ欠損値を補うというというルールなのです。

なお、ルールから外れる、つまり問いと問いに挟まれていない欠損値はそのまま空白としたいと思います。

エクセルでデータを作成し、将来的には、統計ソフトで利用するつもりです。そこでVBAで作成したいのですが、VBAも最近そういう言葉を知ったくらいの知識の私には今、出来そうもありません。時間がありません。どうかよろしくお願いいたします。

    変換前                
USERID    問1    問2    問3     問4    問5 
101    101                101
102    102    102            102
103    103        103        
104    104    104        104    
105    105        105        105
106        106        106    106
107            107        107
108        108        108    
109            109        109
110    110    110        110


    変換後                
USERID    問1    問2    問3     問4    問5 
101    101    101    101    101    101
102    102    102    102    102    102
103    103    103    103    103    103
104    104    104    104    104    104
105    105    105    105    105    105
106        106    106    106    106
107            107    107    107
108        108    108    108    
109            109    109    109
110    110    110    110    110
・ツリー全体表示

【77803】Re:一つのセル内にカンマで区切って表示
発言  γ  - 15/12/29(火) 8:09 -

引用なし
パスワード
   ああ、ポイントは、得点ランクをもとに自動判定する部分でしたか?
それと、文字列操作のもっと基本的な手法も書いておきましょう。

以下はサンプルです。
得点ランクが一つのケースです。必要なら繰り返しに持ち込んで下さい。

Sub test2()
  Dim r As Range
  Dim name As String
  Dim score As Long
  Dim s As String
  Dim scoreRank As String
  Dim lowScore As Long
  Dim highScore As Long

  Columns("E").ClearContents

  scoreRank = Cells(1, 3).Value
  lowScore = CLng(Split(scoreRank, "〜")(0))
  highScore = CLng(Split(scoreRank, "〜")(1))
  
  For Each r In Range(Range("A1"), Range("A1").End(xlDown))
    name = r.Value
    score = r.Offset(, 1).Value
    If score >= lowScore Then
      If score <= highScore Then
        s = s & name & ","
      End If
    End If
  Next
  s = Left(s, Len(s) - 1) '尻尾の","をカット
  Cells(1, 4).Value = s
End Sub
・ツリー全体表示

【77802】Re:一つのセル内にカンマで区切って表示
発言  γ  - 15/12/28(月) 6:44 -

引用なし
パスワード
   一例です。

Sub test()
  Dim dic As Object
  Dim r As Range
  Dim s As String
  Dim name As String
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  '氏名、得点に基づき、該当する得点ランク別のdictionaryに氏名を保持
  For Each r In Range([A1], [A1].End(xlDown))
    name = r.Value
    s = getRank(r.Offset(, 1).Value)
    If Not dic.exists(s) Then
      Set dic(s) = CreateObject("Scripting.Dictionary")
    End If
    dic(s)(name) = Empty
  Next
  
  Columns("D").ClearContents
  
  'カンマで文字列連結して書き出し
  For Each r In Range([C1], [C1].End(xlDown))
    If dic.exists(r.Value) Then
      r.Offset(, 1).Value = Join(dic(r.Value).keys, ",")
    End If
  Next
 
End Sub

'得点毎のランクを得る(得点は整数と仮定)
Function getRank(v As Long) As String
  Select Case v
    Case Is >= 90: getRank = "90〜100"
    Case Is >= 70: getRank = "良"
    Case Is >= 50: getRank = "可"
    Case Else: getRank = "不可"
  End Select
End Function
・ツリー全体表示

【77801】一つのセル内にカンマで区切って表示
質問  A/C  - 15/12/27(日) 23:50 -

引用なし
パスワード
   A列縦に苗字が入っていて、その人数はその都度かわります。B列にある試験の点数が表示されています。C1に90〜100とあり、これは成績が90点から100点までという意味で、D1にその点数の範囲内にある苗字がカンマで区切られて全て表示させるようにしたいのですが、そのプログラムが全くわかりません。
どなたか教えてください。よろしくお願いします。
・ツリー全体表示

【77800】Re:IE操作におけるテーブル行の選択につ...
お礼  失礼します  - 15/12/24(木) 11:00 -

引用なし
パスワード
   ▼γ様

ご質問を頂きありがとうございます。

回答が遅れ、質問内容に情報が不足しており、
大変申し訳ありませんでした。

選択後に期待する動作といたしまして、「OK」ボタンをクリックすることにより、選択したデータを保持したまま次の画面へと遷移する、ということを考えておりました。
そのため、行を選択状態にしないと期待した動作が得られないという状況でありました。

その後、無事、解決致しましたので以下に備忘として記載させて頂きます。

============================

マウスでクリックをした際にはHTMLが書き換わるように実装されていたようで、
HTMLにおけるTRタグのClassNameに「Selected」の文字列が設定されるようになっていました。

そのため、VBA上でもClickイベントを発生させるのではなく、
直接ClassNameプロパティに「Selected」を設定することで
期待した動作を得られるようになりました。

============================

手を尽くし切れていない状態で質問を投稿してしまい申し訳ありませんでした。

また、拙い質問にお付き合い頂きありがとうございました。
・ツリー全体表示

232 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free