• ベストアンサー

EXCEL VBAでできるでしょうか?

アンケートの簡単に調査票を作るために、EXCELのVBAで作ることできるでしょうか? 例)A   B   C   D...と項目は何個になるか未定の場合、別な印刷用のシートなどに、   AはBに対してどの位影響があると思いますか?   AはCに対してどの位影響があると思いますか?   AはDに対してどの位影響があると思いますか?   BはAに対してどの位影響があると思いますか?   BはCに対してどの位影響があると思いますか?   BはDに対してどの位影響があると思いますか?  と、いうような組み合わせのを表示させたいのですが...。同じ項目の場合(AとAなどのような)は表示させないようにしたいのですが、複雑になるのであれば、表示してもかまいません。このようなことがVBAでできるのか、それが簡単なのか難しいことなのかさえまだ勉強中でよくわかりません。すみませんが教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.7

#4、6です。 >”データのある列”をセルB5 >”出力”がSheet2のセルC4の場合 前回とコードを見比べて、 どこが変わったのか、調べてみてください。 なお、データ項目はB5から下方向に、 縦1列に入力されていると想定してあります。 Option Explicit Sub test() '定数の設定 Const strInputSheet As String = "Sheet1" 'データ項目のあるシート Const lngInputRow As Long = 5 'データ項目の開始行 Const lngInputCol As Long = 2 'データ項目のある列(B列) Const strOutputSheet As String = "Sheet2" '出力シート Const lngOutputCol As Long = 3 '出力列(C列に出力) Const lngOutputRow As Long = 4 '出力開始行 Const strMessageA As String = " は " Const strMessageB As String = " に対してどの位影響があると思いますか?" '定義 Dim lngMaxRow As Long Dim lngCountA As Long Dim lngCountB As Long Dim strA As String Dim strB As String Dim lngRow As Long '項目数を把握 Sheets(strInputSheet).Select Cells(ActiveSheet.Rows.Count, lngInputCol).Select Selection.End(xlUp).Select lngMaxRow = Selection.Row 'B列のデータ最終行を取得 lngRow = lngOutputRow '出力開始行の設定 '項目Aをなめる For lngCountA = lngInputRow To lngMaxRow  strA = Cells(lngCountA, lngInputCol).Value '項目Aの取得  '項目Bをなめる  For lngCountB = 1 To lngMaxRow   If lngCountA <> lngCountB Then '項目Aと項目Bが同じときはここは処理しない    strB = Cells(lngCountB, lngInputCol).Value '項目Bを取得    Sheets(strOutputSheet).Cells(lngRow, lngOutputCol).Value = strA & strMessageA & strB & strMessageB '文字列を結合    lngRow = lngRow + 1 '改行する   End If  Next lngCountB Next lngCountA End Sub

bajiru
質問者

お礼

本当に色々細かく質問に答えていただき、ありがとうございました。これで作業もはかどりそうです。活用させていただきます!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.6

こんにちは。 #4です。 >A1やB1の組み合わせを自動的に選んでくれること >項目数の変化にもやはり自動的に対応してくれること こんな感じでどうでしょうか。 コードを書いてみました。 標準モジュールに貼り付けてテストしてみてください。 A列に項目が入力してあると仮定して、 J列に質問文を出力する設定にしてあります。 Const…の行の部分は、定数の設定ですので、代入する数値を実情に応じて変更してください。 順列組み合わせですので、組み合わせの数に注意してください。 項目の組み合わせが65536(Excelの最大行)を超えるとエラーになります。注意してください。 Option Explicit Sub test() '定数の設定 Const lngCol As Long = 1 'データ項目のある列(A列の場合は,1) Const lngOutputCol As Long = 10 '出力列(J列に出力) Const strMessageA As String = " は " Const strMessageB As String = " に対してどの位影響があると思いますか?" '定義 Dim lngMaxRow As Long Dim lngCountA As Long Dim lngCountB As Long Dim strA As String Dim strB As String Dim lngRow As Long '項目数を把握 Cells(ActiveSheet.Rows.Count, lngCol).Select Selection.End(xlUp).Select lngMaxRow = Selection.Row lngRow = 1 '項目Aをなめる For lngCountA = 1 To lngMaxRow strA = Cells(lngCountA, lngCol).Value '項目Aの取得 '項目Bをなめる For lngCountB = 1 To lngMaxRow If lngCountA <> lngCountB Then '項目Aと項目Bが同じときはここは処理しない strB = Cells(lngCountB, lngCol).Value '項目Bを取得 Cells(lngRow, lngOutputCol).Value = strA & strMessageA & strB & strMessageB '文字列を結合 lngRow = lngRow + 1 '改行する End If Next lngCountB Next lngCountA End Sub

bajiru
質問者

補足

ありがとうございます!!ぜひこれを活用させてもらいたいのですが、初歩的な質問をもう二つさせてもらうと、下の”データのある列”をセルB5、”出力”がSheet2のセルC4の場合、どういうふうに文字を入れ替えればいいのでしょうか?すみませんが教えてください。 Const lngCol As Long = 1 'データ項目のある列(A列の場合は,1) Const lngOutputCol As Long = 10 '出力列(J列に出力)

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#3です。 a(1)="A"をa(1)=Range("a1")とかにすれば、セルA1に入れた値を使います。a(2)以下もおなじです。

bajiru
質問者

お礼

今回はどうもありがとうございました。教えていただいたことは今後参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.4

こんばんわ。 これってVBAを使うほどの処理でしょうか? セルの文字列を「&」でつなぐ方法をご存じですか? たとえば、  セルA1に「ネコ」  セルB1に「イヌ」 がある時、セルC3に  「ネコはイヌに対してどのくらい影響があると思いますか?」 と表示させるには、  =A1 & "は" & B1 & "に対してどのくらい影響があると思いますか?" とすればできますよ。

bajiru
質問者

補足

そのとおりだと思います。でも、上記のA1やB1の組み合わせを自動的に選んでくれること、また項目数の変化にもやはり自動的に対応してくれること、この2点を考えるとマクロのような気がしたのですが....。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

エクセルVBAだから出きると言う部分は、画面表示機能 だけです。CでもVBでもロジックは変らないと言うことです。 Sub test05() Dim a(4) a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D" K = 1 For i = 1 To 4 For j = i + 1 To 4 Cells(K, "A") = a(i) & "-" & a(j) K = K + 1 Next j Next i End Sub A列に A-B A-C A-D B-C B-D C-D と出ました。 5個にすると A-B A-C A-D A-E B-C B-D B-E C-D C-E D-E となりました。  ABCDE A* B * C  * D   * E    * の桝目表を作り、対角線より下の3角形部分の組み合わせが出ればよいのでしょう。 Sub test05() Dim a(5) a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D" a(5) = "E" K = 1 For i = 1 To UBound(a) For j = i + 1 To UBound(a) Cells(K, "A") = a(i) & "-" & a(j) K = K + 1 Next j Next i End Subとすればやや一般化できます。配列の値のセット もABC・・・であれば、プログラムでやれます。 後は「-」を「は」にa(j)の後に「に対してどの位影響があると思いますか? 」を””でくくり、&でくっ付ければ好いです。

bajiru
質問者

お礼

ありがとうございます。なんか光が見えてきました!ただ、私の質問の仕方が悪かったのですが、この場合だと項目をマクロに最初から入れていかなくてはだめですよね("A"、"B"の部分)。これを自動的に読み取ってくれて、しかも毎回項目の数も変化するような場合のプログラムも可能なんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • 0shiete
  • ベストアンサー率30% (148/492)
回答No.2

ネットで探されてみてはいかがでしょうか?

参考URL:
http://www.vector.co.jp/vpack/filearea/win95/business/calc/enquate/index.html
全文を見る
すると、全ての回答が全文表示されます。
  • 0shiete
  • ベストアンサー率30% (148/492)
回答No.1

できます。 が、まず、関数だけでできないかどうか を検討されることをお勧めします。

bajiru
質問者

補足

項目数が毎回変わってもマクロボタンを押すだけで自動的にできないか、というのが目標でして、関数をシートに入れておくと毎回項目数が変わるたびにその関数自体(例えば項目数の参照範囲など)も変わってしまうのではないかと思ったからです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで質問です。

    数式か、VBA、どちらでも良いのですが、 A1=1で、なおかつB1=1の場合、C1からC10のDATAをD1からD10に表示する。 A1=1で、なおかつB1=2の場合、C11からC20のDATAをD1からD10に表示する。     ・     ・     ・ というように、"A1"は1~22まで、"B1"は1~6まで、各数字を組み合わせた時のDATAを表示したいのです。 組み合わせも多いのでどうして良いのか分かりません。 素人の浅知恵ではとても無理ですので、お助け下さいまし。。。

  • エクセルのVBAについて

    初めて質問させていただきます。 エクセルの表なのですが、  A 1 a 2 b 3 c 4 D とある表を別のシートに  A 1 a 2 3 b 4 5 c 6 7 d と、一行空けてもしくは数行空けて表示させるVBAはありますか? 自分で色々探してても分からず困っています。 どうかお願いします。

  • EXCEL 空白セル削除 VBA使用せず

    EXCELで、以下のような表を作成しています。   A   B   C   D   E 1 あ  10 2 い  20 3 う  20 4 え  10 5 お  10 もし、B列の値が10なら、C列にA列の内容を次のように表示します。   A   B  C  D  E 1 あ  10  あ 2 い  20  え 3 う  20  お 4 え  10 5 お  10 上の例の場合、C列の2行目・3行目にはA列を反映させないということを VBA無しで行いたいのですが、関数だけで可能でしょうか? 式はいくら複雑になっても構いません。 ヒントになるようなことでも、自分でトライしてみますので、 お教えください。 宜しくお願いします。

  • エクセルで組み合せ一覧表を作成したいです

    エクセルでシート1のA1~O1の各セルには、アルファベットや数字(1~50)が入っています。 A1~O1までの15個のセルから、6つを選択した時の組み合せ一覧を作成したいと思っています。 組み合わせは計算すると、15C6となるので全5005通りになります。 組み合せの一覧は、シート2に表示させたいです。 (a,b,c,d,e,f)と(b,a,c,d,e,f)は同じものとします。 またA1~O1のセルに入るのは、アルファベットと数字の組み合せが複雑であれば、数字のみとしたいと思います。 関数だけで何とかしようと思いましたが、どうしても無理のような気がしてしまいましたので、こちらにご質問をさせて頂きました。 VBAの知識もないため、自分でプログラムを組む事もできません。 シートにVBAを組み込む方法は、これまでに経験があるので理解しております。 アドバイスを頂けると嬉しく思います。 何卒、よろしくお願い致します。

  • エクセルVBA作成に関して

    VBA作成についてお願いいたします. たとえば各セルに以下のような数値があるとします    A   B  C 1 150 2 2 145 6 3 237 7 4 254 6 5 結果としてC5セルに A1*B1+A2*B2+A3*B3+A4*B4の計算をし表示するVBAを作りたいと思っています. このくらい少ない場合はよいのですが,列が多くなるといちいち計算式を書くのは大変ですし,このあたりをVBAで作れないかと悩んでいます. つまり 例表示すると Range("A1").Value とあった場合("A1")の1を2,3,...と増やしていく(あるいは減らしていく)VBAは作成可能ですか? どうも調べたかぎりでは見あたらないようなので. この表現で質問の意図は伝わったでしょうか? ご存じの方よろしくお願いいたします.

  • エクセルVBAで設定したセルの値

    エクセルVBAについての質問です。 例えば、A1とB1のセルの値を参照している数式がC1セルに設定してあるとします。 さらに、D1のセルにはC1の値を参照している数式が設定してあるとします。 VBAでA1、B1のセルの値を変更したとします。 次のステップのVBAでC1、D1のセルを参照すれば、A1、B1の変更が反映された後の正しい値である C1、D1の値が取得できるのでしょうか? できて当たり前だと思うのですが、セルに設定してある数式が大変複雑であったりすると、ちゃんとA1、B1の変更が反映された正しいC1、D1セルの値がVBAで取得できるのかちょっと不安です。 ばかな質問かもしれませんが、回答をよろしくお願い致します。

  • EXCEL VBAで

    EXCEL VBAで シート1のA2~G2までの列にA,B,C,D~と題名があり、それぞれの下の行には数字が並んでます。シート2のA2~G2までの列にもA,B,C,D~と題名がありますが、ランダムに並んでます。シート1のAの行を、シート2のAの行に、BにはBへという風にコピーをさせるにはどのようにすればよいでしょうか。またシート1A~Gのどれかが欠けている場合もあります。その場合はシート1にあるもののみコピーすることとします。 わかりにくいかも知れませんか、どうかよろしくお願いします。

  • Excel VBAでイコール二回使えませんか?

    Excel2003を使っております。 Excel VBAに関しての質問です。 Sub test() a = 5 b = 8 c = d = a + b Cells(5, 99) = c Cells(6, 99) = d End Sub のプログラムを実行してもFALSEと表示されてうまくいきません。 どうやら、 c = d = a + bに問題があるようです。 これって c = a + b d = c と2つに分けなければならないものなのでしょうか? 見た目を良くするために、1つにまとめたいのですが、 何か良い方法はありませんでしょうか?

  • エクセルVBA ワークシート関数の使用について

    エクセル2003VBA ワークシート関数の使用についての質問です よろしくお願いします。 4桁の数字を、千の位・百の位・十の位・一の位に分解する関数ですが 例えば A1に4桁の数字があり、B1に千の位を表示する場合ですが ワークシート関数の場合 B1=MOD(INT($A$1/1000),10) となりますが VBAにてそのまま使用し Range("B1").value=Application.WorksheetFunction.MOD(INT(Range("A1")/1000),10)とするとエラーになります。 エラーになる原因は、いろいろ調べたら分かったのですが この様に、一発でB1に計算結果を入れたいのですが、どうしたらよろしいでしょうか 現在は、 Range("C1").Formula = "=MOD(INT(A1/1000),10)" Range("B1").value=Range("C1").value 一旦、C1に置き換えてから行っています。 よろしくお願いします

  • Excel VBAについて

    VBA初心者です。 社内の様式に合うようなVBAを組みたいのですが。。。 1,様式は表になっており1つのグループに5つの選択肢があり横に5グループ,縦に12グループあります。(例えば1行目にA1.A2.A3.A4.A5|B1.B2.B3.・・・・E3.E4.E5 2行目にF1.F2.F3.F4.F5|G1.G2・・・・12行目にBM1.BM2のような表) 2,シートは2枚あり1枚目のシートで選んだ1グループ1項目に1つだけ○がつく(ダブルクリックで選択し,違う項目を選択すれば前に選んだ項目の○は消える。) 3,1枚目に丸がついた項目が2枚目の任意のセルに表示される(例えば1枚目のシートのAグループのA3を選択すれば2枚目のシートの任意のセルにA3と表示され,取り消し変更された場合は変更後の選択肢のみ表示される) 4,また,選択する項目は変更されないように保護をかけたい。

このQ&Aのポイント
  • NAS共有フォルダ内にあるエクセルファイルのショートカットをデスクトップに置くと、Windows10とWindows7のデスクトップではエクセルのサムネイル表示になってしまうが、他のPCでは通常のエクセルアイコンに表示される。
  • この現象は、ショートカットの作り方によるものであり、機能的な問題はないが、なぜこのような表示になるのか不思議に思っている。
  • ショートカットの作り方に関しては、好ましくないとの意見もあり、その理由についても知りたいと思っている。
回答を見る

専門家に質問してみよう