• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:共通の値をもつ座標の組み合わせについて)

共通の値を持つ座標の組み合わせについて

このQ&Aのポイント
  • 共通の値を持つ座標の組み合わせを表示するVBAの作成方法について考えています。
  • 表の特定の座標に共通の値を持つ組み合わせを表示するVBAを作成したいです。
  • VBAに詳しい方からのアドバイスを頂けると助かります。

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

  • ベストアンサー
  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.20

#11,13,15-19です。 >メモリ不足と表示されてしまいました。 やはり出ますか。(^^;;;;;; 60万件の書出しは可能ということなので 100万件でも通るかな? と思ったのですが…。 安易に過ぎたようです。すみません。 ---------------------- >例えば4GBなどメモリが増えれば あまり詳しいほうではないので (わたしが)誤解している可能性もありますが おそらくPCの問題ではないと思います。 ハードウェアのスペックは、 もちろん処理速度には影響しますが、 Excelが「メモリ不足」エラーを吐く場合は スペック不足というよりも 「Excelがアプリケーションとして  想定・確保している分のメモリを使い切った」 という状況が多いようです。 変数のオーバフローみたいなニュアンスですね。 =============================================== さて。 とりあえず分割書き出しにしてみました。 Sample_18改の書出P(Sub Sample_d)を 以下のように差し替えてください。  ※書出Pの下の書出順調整P(Sub Sample_s2)はそのままです。  ・[書き出し単位]件ずつ書き出して  ・[折り返し単位]セットで折り返します。 例えば  [書き出し単位]:10000  [折り返し単位]:100 に設定した場合、 1万件×100セット=100万件で折り返します。 20万件ずつ書き出して100万件で折り返すなら  [書き出し単位]:200000  [折り返し単位]:5 に設定してください。 一度に多くの行を書き出すほうが速く書き出せますが 多すぎると今度はメモリが足りなくなります。 一般に、速度とメモリの関係は トレードオフになりますので、調整してみてください。 おそらくこれでいけると思いますが、 もし「書出し準備中」表示の段階でメモリ不足になる場合は "お手上げ"ということでご容赦ください。 <(_ _)> =============================================== '  'ヒット----- '  rtCnt = rtCnt + 1 '  rtAry(rtCnt) = rsAry '  If rtCnt Mod 500 = 1 Then '   Application.StatusBar = rtCnt & " 件" '  End If ' ' End Sub '-----↓サシカエ↓------------------------------------------ '書出P---------------------- Private Sub Sample_d(ByRef rtSht As Worksheet)  '設定------------  Const untCnt As Long = 10000    '◆[書き出し単位]  Const setCnt As Long = 100     '◆[折り返し単位]  Const brdClr As Long = vbYellow  '◆[境界塗潰し色] ^^;;    '宣言------------  Dim dpAry() As Variant  Dim o2Ary() As Long  Dim mxCnt  As Long  Dim tpTbl() As Boolean  Dim mxRow  As Long  Dim i    As Long  Dim j    As Long  Dim k    As Long  Dim m    As Long  Dim n    As Long    '並び調整--------  Application.StatusBar = "書き出し準備中:並び調整"  ReDim tpTbl(rtCnt, tbSiz)  mxCnt = 0  For i = 1 To rtCnt   k = 0   rsAry = rtAry(i)   For j = 1 To tbSiz    If rsAry(j) Then     k = k + 1     tpTbl(i, odAry(j)) = rsAry(j)    End If   Next j   If mxCnt < k Then mxCnt = k  Next i    '出順調整--------  Application.StatusBar = "書き出し準備中:出順調整"  ReDim o2Ary(rtCnt)  For i = 1 To rtCnt   o2Ary(i) = i  Next i  Call Sample_s2(1, 1, rtCnt, o2Ary, tpTbl)    '書出------------  Application.StatusBar = "書き出し中"  Application.Calculation = xlCalculationManual  Application.ScreenUpdating = False    With rtSht   .Select   .Cells.Clear  End With    mxRow = untCnt  If rtCnt < mxRow Then mxRow = rtCnt    For m = 0 To (rtCnt - 1) \ mxRow   ReDim dpAry(mxRow, mxCnt)     For i = 1 To mxRow    n = m * mxRow + i    If n > rtCnt Then Exit For    k = 0    For j = 1 To tbSiz     If tpTbl(o2Ary(n), j) Then      k = k + 1      dpAry(i, k) = j     End If    Next j   Next i      Application.StatusBar = _    "書き出し中: " & _    m + 1 & " /" & (rtCnt - 1) \ mxRow + 1       rtSht.Cells(1, 1).Offset( _    (m Mod setCnt) * untCnt, _    (m \ setCnt) * (mxCnt + 1) _    ).Resize(mxRow, mxCnt).Value = dpAry       '◆境界列塗潰し   If m Mod setCnt = 0 Then    rtSht.Columns((m / setCnt + 1) * (mxCnt + 1)) _     .Interior.Color = brdClr   End If       Next m  Application.Calculation = xlCalculationAutomatic End Sub '-----↑サシカエ↑------------------------------------------ ''書出順調整P-------- 'Private Sub Sample_s2( _ ' ByVal lvIdx As Long, _ ' ByVal mnIdx As Long, _ ' ByVal mxIdx As Long, _ ' ByRef o2Ary() As Long, _ ' ByRef tpTbl() As Boolean) =============================================== 以上ご参考まで。長乱文・長乱コード陳謝。

jugyou1
質問者

お礼

返信遅くなりました。何度かテストをしましたが、やはりメモリ不足で書き出し準備中と表示をされてしまいました。 これ以上引っ張ってしまいますと本当に申し訳ありませんので、また気になることがありましたらあらためて質問板を立てさせていただきます。 この質問にかかわっていただきました方(特に_Kyleさん、nag0720さん)には本当にお世話になりました。ありがとうございました。

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

その他の回答 (19)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.9

Long型に変えたのは、Count変数でしょうか。 Countは組み合わせの総数です。 Integer型は32767までですから、それを超えるならLongにしなければなりません。 このプログラムで一番メモリを使っているのは、TBL(SIZE, 10000)ですが、これはチェック用に行ごとの組み合わせを登録している配列で、TBLCountはその数です。 例えば、質問の図の10×10で言えば、1行目の組み合わせの2通りが最大数なので、TBL(SIZE, 2)としても十分です。 132×132の場合でもたぶん1行目の組み合わせが最大になると思いますが、それが10000もいかないならもっと減らしてもいいし、足りなければ増やさなければいけません。 もし処理中に「インデックスが有効範囲にありません」のエラーが出たら、その数をもっと大きくしてください。 TBLCountは、その数が32767を超えなければIntegerのままで大丈夫です。 Longに変えていいのはCountとTBLCountだけですし、この程度のメモリ消費では処理時間にはそんなに影響はないでしょう。 もしこの処理を定期的に行なうのなら、やはりVBAよりVBかCで作ったほうがいいではないでしょうか。 VBAで1時間かかるの処理なら、VBならたぶん5分くらいで終わると思います。Cならもっと速いかもしれません。 VB、Cのコンパイラは両方とも無償でダウンロードできます。

jugyou1
質問者

お礼

アドバイスありがとうございます。評価だけは先に入れさせていただきましたが、返信ができていませんでした。 C言語は昔使ったことがあり、コンパイラのDLもできましたが、当然にこのようなプログラムを私に組むことができないために本当に図々しいことは承知しているのですが、お時間があるときにプログラムを教えていただいたら幸いです。 ちなみに、上述のプログラムを112×112で動かしてみますと1の入っているセルのパターンによって1時間程度で終わる場合もあれば、5,6時間動かしても完了しない場合があります。C言語が早く処理ができるならば、プログラムがどのような動きをするのかも興味があります。 可能でしたらお付き合いいただけるとありがたいです。よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.8

しつこいですが、再々訂正 #6のプログラムでまだ時間が掛かるようでしたら、次の箇所を修正してください(追加4箇所、変更3箇所)。 ・・・・・・・・・・・・ Dim TBL(SIZE, 10000) As Boolean Dim TBLCount As Integer ' -------------------------- 追加 Dim Count As Integer ・・・・・・・・・・・・ Sub Combination() ・・・・・・・・・・・・ Count = 0 For i = 1 To SIZE - 1 TBLCount = 0' ------------------------------------ 追加 TCount = 0 ・・・・・・・・・・・・ End Sub Sub AddCombin(n As Integer, k As Integer) ・・・・・・・・・・・・ If n = 1 Or ExistNext Then Exit Sub ' --------------------------------------------- ここから10行追加 For j = 1 To S(1) - 1 CheckFlag = True For i = 1 To n If Not C(j, S(i)) Then CheckFlag = False Exit For End If Next If CheckFlag Then Exit Sub Next ' -------------------------------------------- ここまで SS = "" For i = 1 To n SS = SS & " " & S(i) Next Application.StatusBar = "処理中:" & SS For j = 1 To TBLCount ' ------------------------- 変更 CheckFlag = True For i = 1 To n ・・・・・・・・・・・・・ Next TBLCount = TBLCount + 1 ' ----------------------- 追加 Count = Count + 1 For j = 1 To SIZE TBL(j, TBLCount) = False ' ----------------------- 変更 Next For i = 1 To n TBL(S(i), TBLCount) = True ' --------------------- 変更 Worksheets("Sheet2").Cells(Count + 1, i + 1) = S(i) Next Worksheets("Sheet2").Cells(Count + 1, 2).Select End Sub なお、#6のプログラムは100×100の場合の検証はできていません。 もしかするとバグがあるかもしれませんので、結果がでても御自分で確認してください。

jugyou1
質問者

お礼

お礼が遅くなりました。改めてありがとうございます。 132×132の表で1の値が入っているセルが3,878で試しましたら、約1時間程度で出力ができました。 以下にいくつか教えていただければと思い、記載させていただきます。 ・一度目の出力で、オーバーフローで型をintからlongに変えまして、2度目の出力で完了しました。ただ、intからlongに変えてメモリを消費するなどやはり注意した方がよろしいでしょうか? ・1の値を入れるセルを変えると、プログラムを動かしても止まる場合があるのですが、注意点などありましたらアドバイスをいただければと思います。 当然に今までのご回答でベストアンサーなのですが、締め切られてしまいますのでもう少しお付き合い頂ければ幸いです。よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.7

再訂正 #6のプログラムの Sub AddCombin(n As Integer, k As Integer) の中の7行目の For i = 1 To n を For i = 2 To n にしてください。

jugyou1
質問者

お礼

訂正ありがとうございます。確認いたしました。

全文を見る
すると、全ての回答が全文表示されます。
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.6

訂正です。 たいした違いはないとは思うけれど、こっちのほうが少し速くなるかもしれません。 Option Explicit Option Base 1 Const SIZE = 10 Dim C(SIZE, SIZE) As Boolean Dim TBL(SIZE, 10000) As Boolean Dim Count As Integer Dim S(SIZE) As Integer Dim T(SIZE) As Integer Dim TCount As Integer Dim SS As String Sub Combination() Dim i As Integer, j As Integer For i = 1 To SIZE - 1 For j = i + 1 To SIZE C(i, j) = Cells(i + 1, j + 1) Next Next Worksheets("Sheet2").Select Count = 0 For i = 1 To SIZE - 1 TCount = 0 For j = i + 1 To SIZE If C(i, j) Then TCount = TCount + 1 T(TCount) = j End If Next S(1) = i AddCombin 1, 1 S(1) = 0 Next Application.StatusBar = "完了" End Sub Sub AddCombin(n As Integer, k As Integer) Dim i As Integer, j As Integer Dim ExistNext As Boolean, CheckFlag As Boolean ExistNext = False For j = k To TCount CheckFlag = True For i = 1 To n If Not C(S(i), T(j)) Then CheckFlag = False Exit For End If Next If CheckFlag Then ExistNext = True S(n + 1) = T(j) AddCombin n + 1, j + 1 S(n + 1) = 0 End If Next If n = 1 Or ExistNext Then Exit Sub SS = "" For i = 1 To n SS = SS & " " & S(i) Next Application.StatusBar = "処理中:" & SS For j = 1 To Count CheckFlag = True For i = 1 To n If Not TBL(S(i), j) Then CheckFlag = False Exit For End If Next If CheckFlag Then Exit Sub Next Count = Count + 1 For j = 1 To SIZE TBL(j, Count) = False Next For i = 1 To n TBL(S(i), Count) = True Worksheets("Sheet2").Cells(Count + 1, i + 1) = S(i) Next Worksheets("Sheet2").Cells(Count + 1, 2).Select End Sub

jugyou1
質問者

お礼

ご丁寧にアドバイスをいただきまして本当にありがとうございます。プログラムを動かしてみて、再度ご報告申し上げます。よろしくお願いします。

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

改良版のプログラムです。 100×100で実行する場合は、SIZEを100に変更してください。 組み合わせ結果は随時、Sheet2に出力されますので、プログラムの実行はコード画面からではなく、シート画面のツールメニューの「マクロ」から実行してください。 また、シート画面下段のステータスバー領域に途中経過を表示していますから、ステータスバーを表示状態にしておいてください。 スピード重視でコーディングしているので前より速くなっているはずですが、100×100ではどのくらい時間が掛かるか見当もつきません。 もしこれでだめだったら、他の言語で作るしかないでしょう。 Option Explicit Option Base 1 Const SIZE = 10 Dim C(SIZE, SIZE) As Boolean Dim TBL(SIZE, 10000) As Boolean Dim Count As Integer Dim S(SIZE) As Integer Dim SS As String Sub Combination() Dim i As Integer, j As Integer For i = 1 To SIZE - 1 For j = i + 1 To SIZE C(i, j) = Cells(i + 1, j + 1) Next Next Worksheets("Sheet2").Select Count = 0 For i = 1 To SIZE - 1 S(1) = i AddCombin 1, i S(1) = 0 Next Application.StatusBar = "完了" End Sub Sub AddCombin(n As Integer, k As Integer) Dim i As Integer, j As Integer Dim ExistNext As Boolean, CheckFlag As Boolean ExistNext = False For j = k + 1 To SIZE CheckFlag = True For i = 1 To n If Not C(S(i), j) Then CheckFlag = False Exit For End If Next If CheckFlag Then ExistNext = True S(n + 1) = j AddCombin n + 1, j S(n + 1) = 0 End If Next If n = 1 Or ExistNext Then Exit Sub SS = "" For i = 1 To n SS = SS & " " & S(i) Next Application.StatusBar = "処理中:" & SS For j = 1 To Count CheckFlag = True For i = 1 To n If Not TBL(S(i), j) Then CheckFlag = False Exit For End If Next If CheckFlag Then Exit Sub Next Count = Count + 1 For j = 1 To SIZE TBL(j, Count) = False Next For i = 1 To n TBL(S(i), Count) = True Worksheets("Sheet2").Cells(Count + 1, i + 1) = S(i) Next Worksheets("Sheet2").Cells(Count + 1, 2).Select End Sub

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

#3です。 #3のコードは、あまり時間をかけずに雑に作ってしまいましたので、 もう少し分かりやすいコードにしてみました。 配列の使い方が少し違いますが、基本的なアルゴリズムは同じです。 Sub test() Const SIZE = 10 Dim S(SIZE) As Integer Dim TBL(SIZE, 1000) As Integer n = 0 For i = 1 To SIZE - 1 S(i) = 1 For j = i + 1 To SIZE S(j) = Cells(i + 1, j + 1) Next Do m = 0 For j = i + 1 To SIZE If S(j) > 0 Then m = m + 1 Next If m = 0 Then Exit Do p = 0 For j = i + 1 To SIZE - 1 If S(j) > 0 Then For k = j + 1 To SIZE If S(k) > 0 And Cells(j + 1, k + 1) > 0 Then p = p + 1 Next End If Next If p < m * (m - 1) / 2 Then m = 0 If m > 0 Then For k = 1 To n p = 0 For j = i To SIZE If S(j) > 0 And TBL(j, k) > 0 Then p = p + 1 Next If p = m + 1 Then m = 0 Exit For End If Next If m > 0 Then n = n + 1 k = 0 For j = i To SIZE TBL(j, n) = S(j) If TBL(j, n) > 0 Then k = k + 1 Worksheets("Sheet2").Cells(n + 1, k + 1) = j End If Next End If End If For j = SIZE To i + 1 Step -1 If Cells(i + 1, j + 1) > 0 Then If S(j) > 0 Then S(j) = 0 Exit For Else S(j) = Cells(i + 1, j + 1) End If End If Next Loop Next End Sub >ちなみに、今回は10行×10列ですが、これが100行×100列になる場合や左図の表の中の値1が多くなると、 >プログラム開始から終了までの時間は長くなりますか? このプログラムは、行ごとに総当たり法で1がある列の全ても組み合わせを調べてます。 100行×100列になるだけなら、処理時間は行数×列数に比例するだけですが、 1行の中の1の値が多くなると、処理時間は指数関数的に増大します。 ただ、たいした計算はやっていないのでそんなに処理時間は掛からないとは思いますが、 実際はやってみないと分かりません。 どうしても我慢できないほど時間が掛かるようでしたら、エクセルのVBAではなく、 VisualBasicやCなどのコンパイラ言語で書いたほうがいいかもしれません。 他の方法として、総当たり法ではなく、再帰的アルゴリズムを使って効率よく組み合わせを調べる方法もあります。 今はあまり時間がないので作るのに少し日数が必要ですが、興味があるなら作ってみましょうか?

jugyou1
質問者

お礼

アドバイスありがとうございます。実際に100×100で、1が入っているセルが約900程あるのですが、VBAを動かしてみますと応答なしになってしまいます。時間が経つと結果は出るような気がしますが・・・という状況です。 もしよろしければ効率よく組み合わせを調べるプログラムがあると幸いです。何かとご面倒をおかけしますが、ご助力頂けますと幸いです。 あらためてよろしくお願いします。

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

きれいなコードではないですが、次のようになります。 Sub test() Dim TBL1(10) As Integer Dim TBL2(10) As Integer n = 0 For i = 1 To 9 m = 0 TBL1(m) = i TBL2(m) = i For j = i + 1 To 10 If Cells(i + 1, j + 1) = 1 Then m = m + 1 TBL1(m) = j TBL2(m) = j End If Next Do Flag = False For k = 1 To m If TBL2(k) > 0 Then Flag = True Exit For End If Next If Not Flag Then Exit Do Flag = True For k1 = 1 To m - 1 For k2 = k1 + 1 To m If TBL2(k1) > 0 And TBL2(k2) > 0 Then If Cells(TBL2(k1) + 1, TBL2(k2) + 1) = 0 Then Flag = False Exit For End If End If Next If Not Flag Then Exit For Next If Flag Then For p = 1 To n Flag2 = True For k = 0 To m If TBL2(k) > 0 Then Flag3 = False For j = 1 To Worksheets("Sheet2").Cells(p + 1, 1) If Worksheets("Sheet2").Cells(p + 1, j + 1) = TBL2(k) Then Flag3 = True Exit For End If Next If Not Flag3 Then Flag2 = False Exit For End If End If Next If Flag2 Then Flag = False Exit For End If Next End If If Flag Then n = n + 1 j = 0 For k = 0 To m If TBL2(k) > 0 Then j = j + 1 Worksheets("Sheet2").Cells(n + 1, j + 1) = TBL2(k) End If Next Worksheets("Sheet2").Cells(n + 1, 1) = j End If k = m Do While k > 0 If TBL2(k) > 0 Then TBL2(k) = 0 Exit Do Else TBL2(k) = TBL1(k) k = k - 1 If k <= 0 Then Exit Do End If Loop Loop Next For p = 1 To n Worksheets("Sheet2").Cells(p + 1, 1) = "" Next End Sub なお、Sheet2のA列を作業用に使用しています。(最後に消去しています) もしA列が使えない場合は他の列に変更してください。 結果は、 1 2 5 7 1 5 7 8 3 7 4 5 7 5 8 10 7 8 9 となりました。 質問の図の右側の結果には「1 5 7 8」と「5 8 10」がありませんが、これは組み合わせとして成立していないんでしょうか?

jugyou1
質問者

お礼

ご回答いただきましてありがとうございました。 質問の「5 8 10」がありませんが、これは組み合わせとして成立していないんでしょうか? というものですが、成立します。目で追ってると抜け落ちてしまうところがありました。 ちなみに、今回は10行×10列ですが、これが100行×100列になる場合や左図の表の中の値1が多くなると、プログラム開始から終了までの時間は長くなりますか?アドバイスいただけますとありがたいです。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です。 お礼欄を読みました。 左の表から右の表のようなデータを引き出したい!というコトですが・・・ いくら画像とにらめっこしても 左の表から右の表への規則性が判りません。 当方の解釈では↓の画像のような感じの規則性しか見当たらないのですが、 とりあえずコードを載せてみます。 今回もSheet1のSheetマクロです。 Sub test2() Dim i As Long, j As Long, k As Long Dim ws As Worksheet Set ws = Worksheets("Sheet2") ws.Cells.ClearContents For i = 2 To 11 If WorksheetFunction.Count(Rows(i)) > 1 Then ws.Cells(Rows.Count, 2).End(xlUp).Offset(1) = Cells(i, 1) End If For j = 2 To 11 If Cells(i, j) = 1 Then k = ws.Cells(Rows.Count, 2).End(xlUp).Row ws.Cells(k, Columns.Count).End(xlToLeft).Offset(, 1) = Cells(1, j) End If Next j Next i ws.Activate End Sub ※ 今回も外していたらごめんなさいね。m(_ _)m

jugyou1
質問者

お礼

再度のアドバイスありがとうございます。 Sheet2の2行目の場合は、1 2 5 7 8 と表示されているため、Sheet1の表の (1行,2列)、(1行,5列)、(1行,7列)、(1行,8列)、(2行,5列)、(2行,7列)、(2行,8列)、(5行,7列)、(5行,8列)、(7行,8列)の所に全て1の値が入力されているということなのですが、(2行,8列)のところに1がないために、Sheet2の2行目の場合は、8を除いた1 2 5 7が表示されるというわけです。 Sheet2の6行目は5 7 8 10とありますが(7行,10列)のところに1がないために、Sheet2の2行目の場合は、10を除いた5 7 8が表示されるというわけです。 Sheet2の8行目は8 9 10とありますが(9行,10列)のところに1がないために、Sheet2の2行目の場合は、10を除いた8 9が表示されるというわけです。 ご理解いただき、改めてアドバイスいただけますと幸いです。よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 一例です。 アップされている、左側の画像がSheet1で右側がSheet2だとします。 (1)Sheet1のA列および1行目は1~10の数値が入っている。 (2)Sheet2は画像通り、B2セル以降に数値が入っている。 という前提です。 画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub test() 'この行から Dim i As Long, j As Long, k As Long, L As Long, M As Long Dim ws As Worksheet Set ws = Worksheets("Sheet2") Range(Cells(2, 2), Cells(11, 11)).ClearContents For i = 2 To ws.Cells(Rows.Count, 2).End(xlUp).Row If WorksheetFunction.Count(ws.Rows(i)) > 1 Then For j = 2 To ws.Cells(i, Columns.Count).End(xlToLeft).Column - 1 For k = j + 1 To ws.Cells(i, Columns.Count).End(xlToLeft).Column L = WorksheetFunction.Match(ws.Cells(i, j), Columns(1), False) M = WorksheetFunction.Match(ws.Cells(i, k), Rows(1), False) Cells(L, M) = 1 Next k Next j End If Next i End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

jugyou1
質問者

お礼

丁寧なご回答ありがとうございました。右側の画像から左の画像を出力するためのプログラムを教えていただいたのですが、左側のデータが与えられている場合に、右側のデータを出力するためにどのようにしたらいいか困っている状況です。 よろしければアドバイスいただけますと幸いです。よろしくお願いします。

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

関連するQ&A

  • エクセルVBAでVLookupを使って値を転記する

    エクセル2003で商品の一覧表を作成しています。 Sheet1は商品一覧(左図) Sheet2は価格表(右図)となっています。 マクロを使用して、Sheet1のB列に価格表のデータを転記させたいと考えています。 VLookupになるのかと思い、自分でいろいろとやってみたのですが、 どうしても動作せず、挫折してしまいました。 商品一覧の最後の行までいって、空白セルがくると止まるというのが、 難しくてできませんでした。 どうかお願いいたします。

  • 2つの数字の組み合わせに対応する文字を返すコードを教えてください。

    すみませんがお知恵を拝借させてください。下のような表で,B列の値に0~3,C列の値に0~3のいずれかを入れたとき,2つの数字の組み合わせに対応するA列にある名前を返すコードを教えていただけませんか。  例えば,B列の値=2,C列の値=0のとき,「酒井」と出力したいのですが。 ※2つの数字の組み合わせに重複はありません。範囲は下に書いた10名分のみです。よろしくお願いいたします。  ----------------------------------------- B列の値:_ C列の値:_ A列  B列  C列 ------------------- 大田  3   0 酒井  2   0 三宅  2   1 坂下  1   0 原田  0   0 山内  0   1 山口  1   1 相馬  1   2 渡辺  0   2 安藤  0   3

  • 選択した行の値だけを合計

    選択した行の値だけを、その行のどのセルをダブルクリックしても合計する方法を教えてください。 A列は、ID,B・C列は値があらかじめ入力されています。 D列に、合計を表示させたいです。 関数・VBAでは、一括して合計はでましたが、VBAで必要な行だけの合計の出し方がわかりません。 VBAの勉強のために活かしたいく、よろしくお願いします。

  • エクセルVBAでのまとめ計算

     初めまして、よろしくお願いします。 データーで    A      B     C     D      E ・・・ 1              5     7      2 2              3     7      0 3 4              6     3      6 5              2     8      3 6              0     3      4 ・     ・      ・      ・      ・ ・     ・      ・      ・      ・ 100             3     4      5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。

  • 組合せVBA

    環境はExcel2002です A列に連番数字1から100が入力されていて B列の100行には数字のデータがあるとします ある目的の数値Xに一番近くなるB列の組合せをC列に表示したいのです…VBAで B列に表示するのはA列の連番です 『一番近くなる』の意味は2通りあって、両方の算出方法をご教示願います (1)目的の数値Xを絶対超えないで目的の数値Xに一番近くなる組合せ (2)目的の数値Xを必ず超えて目的の数値Xに一番近くなる組合せ

  • エクセル 値が一致しないものを見つけたい

    お世話になります。 エクセルでA列B列にそれぞれ数値が入っている表があり、A列にはあってB列にはない数値を分かるようにしたいと思っています。      A列  B列   C列 1行目  1   1 2行目  1   5 3行目  4   0   4 4行目  5   1    5行目  1   0   1 ・A1、A2、A5の値が1であるように、A・B列とも重複する数値が入ることがあります。 ・A列とB列の値は1対1で対応し、例えばA1がB1と対応するならA2はB4と対応します。 この表ではA3、A5に対応する値がB列にないので、C列にその値を表示させています。 ・一致しない数字を分かるようにする方法にこだわりはなく、例のようにC列に値や×を表示させる、A列に色をつける、一致するものがあった数値は削除する等、なんでも構いません。 お分かりになる方、どうぞよろしくお願いいたします。

  • 【エクセル】歯抜けの空白欄に上段と同じ値を入れたい

    エクセル(2010)で ある表に ところどころ空欄があり、 そこに上段と同じ値を入れたいです。 随時発生する作業のため マクロ(もしくはVBA)が組めればと考えておりますが、 初心者につき、ご教示いただけますでしょうか。 A列:項番 B列:大項目 C列:中項目 D列:小項目 E列:備考 ※1行目:項目名、2行目以降:値 という表で、 A列のナンバリング・D列の小項目 以外は 上と同じ扱いとなるため空欄となってしまっていますが、 アクセス(DB)に取り込むため、空欄の無い形にしたいのです。 ※ちなみに、A列・D列は空欄が無い状態=最終行以下は空白です。 よろしくお願い致します。

  • 【VBA】組み合わせの計算

    VBAにてランダム(適当)な値10個の中で1.5に近い組み合わせを探し、それ以外の値を隣の列に移動させたいのですが、方法がわかりません。 どなたか教えてください

  • Excel VBAにて座標読み込み・配置

    当方、Excel VBAに関しては全くのド素人でございます。 お客さんに頼まれて、次のことをやりたいのですが、どうしたらよいか途方に暮れています。 (-50,-50)~(50,50)までの2mピッチの合計2601個のxyz座標データ(txt)をSheetに読み込み。 A列=x B列=y C列=z そしてAD列・26行のセルを座標(0,0)として、セルにz値を展開したいのです。 横軸=x 縦軸=y BC列・1行が(50,50) E列・51行が(-50,-50) 以上のことをExcel VBAでやりたいのですが・・・ 可能でしょうか? 宜しくお願いします。

  • エクセルVBA 変数Aと変数Bの組み合わせに対応する値を返すコード

    ワークシート上に次の表があり,この表をもとにして,変数A(0~4)と変数B(0~4)の組み合わせに対応するC列の値を返すコードは,どう書いたらよいでしょうか。  例えば,変数Aのセルに●(4),変数Bのセルに▲(0)と入力したら,値のセルに■(5)と表示させたいのです。  どなたか教えていただけませんか。 A列  B列  C列  4   0   5  3   1   4  3   0   5  2   2   3  2   1   4  2   0   4  1   3   2  1   2   2  1   1   3  1   0   3  0   4   1  0   3   1  0   2   2  0   1   3  0   0   3 変数A:● 変数B:▲ 値:■

専門家に質問してみよう