Excel VBA質問箱 IV

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

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


2436 / 13646 ツリー ←次へ | 前へ→

【68028】文字を繋げてから、縦列に並び替える ケイ 11/1/26(水) 13:55 質問[未読]
【68034】Re:文字を繋げてから、縦列に並び替える Jaka 11/1/26(水) 15:20 発言[未読]
【68037】Re:文字を繋げてから、縦列に並び替える ケイ 11/1/26(水) 17:50 お礼[未読]
【68042】Re:文字を繋げてから、縦列に並び替える Jaka 11/1/27(木) 9:21 発言[未読]
【68046】ひょっとして。 Jaka 11/1/27(木) 11:10 発言[未読]
【68038】Re:文字を繋げてから、縦列に並び替える UO3 11/1/26(水) 20:44 回答[未読]
【68039】Re:文字を繋げてから、縦列に並び替える UO3 11/1/26(水) 21:57 発言[未読]
【68044】Re:文字を繋げてから、縦列に並び替える ケイ 11/1/27(木) 10:39 お礼[未読]
【68045】Re:文字を繋げてから、縦列に並び替える UO3 11/1/27(木) 11:09 回答[未読]
【68047】Re:文字を繋げてから、縦列に並び替える ケイ 11/1/27(木) 11:19 お礼[未読]

【68028】文字を繋げてから、縦列に並び替える
質問  ケイ E-MAIL  - 11/1/26(水) 13:55 -

引用なし
パスワード
   以下のようなことがしたいのですが、どうにも方法がわかりません。
助けていただけましたらよろしくお願いいたします。

以下のように、A列、C列、E列にフラグが立つ仕組みのものがあります。
フラグの立つ列は決まっていますが、いつどこに立つかは決まっていません。


  A  B  C  D  E  F  G
1  1          1
2  1     1
3  1       

A列にフラグが立ったら○○○とする
C列にフラグが立ったら×××とする
E列にフラグが立ったら△△△とする

このように置き換えた結果をG列にカンマ区切りで繋げて出す。
上の1行目の場合ならA列とE列にフラグが立つので「○○○,△△△」
という結果を出し、更に別シートのL列に

 L列
○○○
△△△

と縦に並べて表示をさせたい。
最終的にフラグが立ったところの置き換え文字が、縦に並べられればよいので
この方法でなくてもかまわないのですが、問題は横に全部で何個フラグが立つかわからない事と、それを縦に置き換えたいことです。

なにか良い方法はないでしょうか。
面倒が質問のようで申し訳ありませんがよろしくお願いいたします。

【68034】Re:文字を繋げてから、縦列に並び替える
発言  Jaka  - 11/1/26(水) 15:20 -

引用なし
パスワード
   色々考えたけど、ベタな数式でもいいんじゃないかと思ったんだけど、ベタ?

>「○○○,△△△」という結果を出し、

どこに出すのか解らないので、G1に
=IF(A1&C1&E1="","",LEFT(IF(A1=1,"○○○,","")&IF(C1=1,"×××,","")&IF(E1=1,"△△△,",""),LEN(IF(A1=1,"○○○,","")&IF(C1=1,"×××,","")&IF(E1=1,"△△△,",""))-1))

別シートのL1
=SUBSTITUTE(上の数式が入ったシート名!G1,",",CHAR(10))

【68037】Re:文字を繋げてから、縦列に並び替える
お礼  ケイ E-MAIL  - 11/1/26(水) 17:50 -

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

ご回答ありがとうございました。
関数でもできるんですね。

このフラグが10列位たつものに対応する場合
何かVBAでできたら良いなとおもいました。

あと、結果なのですが、○○○,△△△
となった場合、セルの縦方向に

○○○
△△△

というふうに最後置き換えてコピーができたら完璧なのです…。


>色々考えたけど、ベタな数式でもいいんじゃないかと思ったんだけど、ベタ?
>
>>「○○○,△△△」という結果を出し、
>
>どこに出すのか解らないので、G1に
>=IF(A1&C1&E1="","",LEFT(IF(A1=1,"○○○,","")&IF(C1=1,"×××,","")&IF(E1=1,"△△△,",""),LEN(IF(A1=1,"○○○,","")&IF(C1=1,"×××,","")&IF(E1=1,"△△△,",""))-1))
>
>別シートのL1
>=SUBSTITUTE(上の数式が入ったシート名!G1,",",CHAR(10))

【68038】Re:文字を繋げてから、縦列に並び替える
回答  UO3  - 11/1/26(水) 20:44 -

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

こんばんは

要件を誤解していたらご容赦。
途中のフラッグを判定しているところが、ちょっとベタな感じでかっこ悪いのですが。

Option Explicit

Sub Sample()
  Dim mRow As Long
  Dim i As Long, k As Long
  Dim v() As String
  Dim c As Range
  
  Application.ScreenUpdating = False
  
  i = 1
  With Sheets("Sheet1")
    mRow = WorksheetFunction.Max(.Range("A" & .Rows.Count).End(xlUp).Row, _
                   .Range("C" & .Rows.Count).End(xlUp).Row, _
                   .Range("E" & .Rows.Count).End(xlUp).Row)
    
    .Columns("G").ClearContents
    .Columns("L").ClearContents
    
    For Each c In .Range("A1:A" & mRow)
      k = 0
      ReDim v(1 To 3)
      If c.Value = 1 Then
        k = k + 1
        v(k) = "○○○"
      End If
      If c.Offset(0, 2).Value = 1 Then
        k = k + 1
        v(k) = "XXX"
      End If
      If c.Offset(0, 4).Value = 1 Then
        k = k + 1
        v(k) = "△△△"
      End If
      If k > 0 Then
        ReDim Preserve v(1 To k)
        c.Offset(0, 6).Value = Join(v, ",") 'G列
        .Cells(i, "L").Resize(k).Value = WorksheetFunction.Transpose(v)
        i = i + k
      End If
    Next
  End With
  
  Application.ScreenUpdating = True
  
End Sub

【68039】Re:文字を繋げてから、縦列に並び替える
発言  UO3  - 11/1/26(水) 21:57 -

引用なし
パスワード
  
ReDim Preserve v(1 To k)
これは、なくてもOKです。(あっても、害にはなりませんが)

【68042】Re:文字を繋げてから、縦列に並び替える
発言  Jaka  - 11/1/27(木) 9:21 -

引用なし
パスワード
   ▼ケイ さん:
>あと、結果なのですが、○○○,△△△
>となった場合、セルの縦方向に
>
>○○○
>△△△
>
>というふうに最後置き換えてコピーができたら完璧なのです…。

これは、セルの書式で「折り返して表示」にチェックを入れれば良いです。
「,」をセルの改行文字、Char(10)に変えているので。
改行文字が入っていても、手動での Alt + Ent と違って自動で
「折り返して表示」にチェックが入りません。(数式なので)

【68044】Re:文字を繋げてから、縦列に並び替える
お礼  ケイ E-MAIL  - 11/1/27(木) 10:39 -

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

ご返信ありがとうございました。
凄いです。やりたい結果が出ていました。

最後L列にカンマ区切りを切り離して、縦列に並び替えているところですが

.Cells(i, "L").Resize(k).Value = WorksheetFunction.Transpose(v)

この結果を別シート「Sheet2」のL列に出せるように書き換えるとしたら
どこに何を書き足せばよいでしょうか。


>▼ケイ さん:
>
>こんばんは
>
>要件を誤解していたらご容赦。
>途中のフラッグを判定しているところが、ちょっとベタな感じでかっこ悪いのですが。
>
>Option Explicit
>
>Sub Sample()
>  Dim mRow As Long
>  Dim i As Long, k As Long
>  Dim v() As String
>  Dim c As Range
>  
>  Application.ScreenUpdating = False
>  
>  i = 1
>  With Sheets("Sheet1")
>    mRow = WorksheetFunction.Max(.Range("A" & .Rows.Count).End(xlUp).Row, _
>                   .Range("C" & .Rows.Count).End(xlUp).Row, _
>                   .Range("E" & .Rows.Count).End(xlUp).Row)
>    
>    .Columns("G").ClearContents
>    .Columns("L").ClearContents
>    
>    For Each c In .Range("A1:A" & mRow)
>      k = 0
>      ReDim v(1 To 3)
>      If c.Value = 1 Then
>        k = k + 1
>        v(k) = "○○○"
>      End If
>      If c.Offset(0, 2).Value = 1 Then
>        k = k + 1
>        v(k) = "XXX"
>      End If
>      If c.Offset(0, 4).Value = 1 Then
>        k = k + 1
>        v(k) = "△△△"
>      End If
>      If k > 0 Then
>        ReDim Preserve v(1 To k)
>        c.Offset(0, 6).Value = Join(v, ",") 'G列
>        .Cells(i, "L").Resize(k).Value = WorksheetFunction.Transpose(v)
>        i = i + k
>      End If
>    Next
>  End With
>  
>  Application.ScreenUpdating = True
>  
>End Sub

【68045】Re:文字を繋げてから、縦列に並び替える
回答  UO3  - 11/1/27(木) 11:09 -

引用なし
パスワード
   ▼ケイ さん:
3ヶ所追加、2ヶ所変更しています。

Sub Sample2()
  Dim mRow As Long
  Dim i As Long, k As Long
  Dim v() As String
  Dim c As Range
  Dim sh2 As Worksheet         '<==追加
  
  Application.ScreenUpdating = False
  Set sh2 = Sheets("Sheet2")      '<==追加
  i = 1
  With Sheets("Sheet1")
    mRow = WorksheetFunction.Max(.Range("A" & .Rows.Count).End(xlUp).Row, _
                   .Range("C" & .Rows.Count).End(xlUp).Row, _
                   .Range("E" & .Rows.Count).End(xlUp).Row)
  
    .Columns("G").ClearContents
    sh2.Columns("L").ClearContents  '<==変更
  
    For Each c In .Range("A1:A" & mRow)
      k = 0
      ReDim v(1 To 3)
      If c.Value = 1 Then
        k = k + 1
        v(k) = "○○○"
      End If
      If c.Offset(0, 2).Value = 1 Then
        k = k + 1
        v(k) = "XXX"
      End If
      If c.Offset(0, 4).Value = 1 Then
        k = k + 1
        v(k) = "△△△"
      End If
      If k > 0 Then
        ReDim Preserve v(1 To k)
        c.Offset(0, 6).Value = Join(v, ",") 'G列
        sh2.Cells(i, "L").Resize(k).Value = WorksheetFunction.Transpose(v)  '<==変更
        i = i + k
      End If
    Next
  End With
 
  Set sh2 = Nothing          '追加
  Application.ScreenUpdating = True
 
End Sub

【68046】ひょっとして。
発言  Jaka  - 11/1/27(木) 11:10 -

引用なし
パスワード
   >>○○○
>>△△△

ひょっとして、これは1つにセルに表示でなく、
2行にわたってという意味だったのでしょうか?

   A
1 ○○○
2 △△△

【68047】Re:文字を繋げてから、縦列に並び替える
お礼  ケイ E-MAIL  - 11/1/27(木) 11:19 -

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

ご返信ありがとうございます。

まったく私の質問した内容にパーフェクトなご回答でした。
本当に助かりました。

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


>▼ケイ さん:
>3ヶ所追加、2ヶ所変更しています。
>
>Sub Sample2()
>  Dim mRow As Long
>  Dim i As Long, k As Long
>  Dim v() As String
>  Dim c As Range
>  Dim sh2 As Worksheet         '<==追加
>  
>  Application.ScreenUpdating = False
>  Set sh2 = Sheets("Sheet2")      '<==追加
>  i = 1
>  With Sheets("Sheet1")
>    mRow = WorksheetFunction.Max(.Range("A" & .Rows.Count).End(xlUp).Row, _
>                   .Range("C" & .Rows.Count).End(xlUp).Row, _
>                   .Range("E" & .Rows.Count).End(xlUp).Row)
>  
>    .Columns("G").ClearContents
>    sh2.Columns("L").ClearContents  '<==変更
>  
>    For Each c In .Range("A1:A" & mRow)
>      k = 0
>      ReDim v(1 To 3)
>      If c.Value = 1 Then
>        k = k + 1
>        v(k) = "○○○"
>      End If
>      If c.Offset(0, 2).Value = 1 Then
>        k = k + 1
>        v(k) = "XXX"
>      End If
>      If c.Offset(0, 4).Value = 1 Then
>        k = k + 1
>        v(k) = "△△△"
>      End If
>      If k > 0 Then
>        ReDim Preserve v(1 To k)
>        c.Offset(0, 6).Value = Join(v, ",") 'G列
>        sh2.Cells(i, "L").Resize(k).Value = WorksheetFunction.Transpose(v)  '<==変更
>        i = i + k
>      End If
>    Next
>  End With
> 
>  Set sh2 = Nothing          '追加
>  Application.ScreenUpdating = True
> 
>End Sub

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