Excel VBA質問箱 IV

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

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


874 / 13645 ツリー ←次へ | 前へ→

【77804】VBA素人です。至急お願いいたします。 kenkyu-sya 15/12/30(水) 9:58 質問[未読]
【77805】Re:VBA素人です。至急お願いいたします。 β 15/12/30(水) 10:38 発言[未読]
【77807】Re:VBA素人です。至急お願いいたします。 kenkyu-sya 15/12/30(水) 11:10 回答[未読]
【77806】Re:VBA素人です。至急お願いいたします。 β 15/12/30(水) 10:48 発言[未読]
【77808】Re:VBA素人です。至急お願いいたします。 kenkyu-sya 15/12/30(水) 11:49 お礼[未読]
【77810】Re:VBA素人です。至急お願いいたします。 β 15/12/30(水) 12:34 発言[未読]
【77811】Re:VBA素人です。至急お願いいたします。 β 15/12/30(水) 12:36 発言[未読]
【77809】Re:VBA素人です。至急お願いいたします。 β 15/12/30(水) 11:49 発言[未読]
【77816】Re:VBA素人です。至急お願いいたします。 kenkyu-sya 15/12/30(水) 17:22 お礼[未読]

【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

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

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

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

また、これは、こちらがとやかくいうことではありませんけど
本当に、問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

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

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


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

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

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

お忙しいところ、レスありがとうございました。

【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

【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

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

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

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

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

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

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

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

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

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

もう1つ。
アップされたレイアウト、"USERID" が A1、"問5" が F1 という前提です。

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

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

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

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

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

本当にありがとうございました。
今後もどうかよろしくお願いいたします。

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