• ベストアンサー

Numberシートにナンバリングして表示したい

EXCEL(VBA)で DATAシートのA2セル以下にターゲットの文字列が入っています。  (ターゲットの文字列は、複数の場合もあります。) この文字列の左からの位置を数えた数値を視覚的に知るために  Numberシートにナンバリングして表示したいのですが  VBAで処理できますか ? 言葉で解説するのが難しいので  参照画像を参照してください。 -------------- 半角、全角はスペースを含めて同じ1文字とします。 参照画像 https://imgur.com/ktTxZuP

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1640/2489)
回答No.6

> DATAシートを表示した状態では、Sub Nubering3()でエラーが出ます。 ごめんなさい。Ws2指定してなかったところが数か所ありましたので以下で試してみてください。 他も気になったところ変更しました。 If Ws2.Range("A1").Value = "" Then ↓ If Ws2.Range("A1").Value = "" And WRow = 2 Then Sub Nubering3() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, WRow As Long Dim uRows As Range, uRange As Range Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Set uRows = Ws2.Rows(1) Set uRange = Ws2.Range("A2") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row WRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row + 1 If Ws2.Range("A1").Value = "" And WRow = 2 Then WRow = 1 End If Set uRows = Union(uRows, Ws2.Rows(WRow)) For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, j)) Next Next i ''Numeling 大文字、中央揃え uRows.HorizontalAlignment = xlCenter uRows.Font.Bold = True '分割文字中央揃え罫線外枠 uRange.HorizontalAlignment = xlCenter uRange.Borders.LineStyle = xlContinuous 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 ' Application.ScreenUpdating = True Set Ws1 = Nothing Set Ws2 = Nothing Set uRows = Nothing Set uRange = Nothing End Sub

NuboChan
質問者

お礼

No3の修正(気になった点も含めて)ありがとうございます。 修正でエラー無く完動しました。 uRows、uRangeと見たこと無いコードが出てきたので  WEB検索して見ましたがヒットしませんでした。 両者の解説したWEB等あれば紹介ください。

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

その他の回答 (6)

  • kkkkkm
  • ベストアンサー率65% (1640/2489)
回答No.7

> uRows、uRangeと見たこと無いコード 両方とも変数です。Unionされた行とセルなのでURowsとURangeとかにしただけでたいした意味はありません。Dim で指定しているのは全て変数です。変数名考えるの面倒なので殆どは適当です。

NuboChan
質問者

補足

失礼しました。  ピントはずれな質問でお手数をおかけしました。 Dim の設定のところ、改訂版でチェックしていませんでした。 (DIMの設定が追加されていたのを見逃していました。) これでやりたいことは、出来るようになったので解決とします。 お世話になりました。

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

関数と条件付き書式でできますが。 A1: =IF(A2="","",COLUMN()) A2: =MID(INDEX(DATA!$A:$A,ROW()/2+1),COLUMN(),1) 条件付き書式、新しいルール、 数式を使用して、書式設定するセルを決定 次の数式を満たす場合に値を書式設定、 =A1>"" 書式、罫線、外枠、OK、OK 前にも書きましたが、条件が変わったのなら再質問すべきです。 https://okwave.jp/qa/q9852905.html 貴殿がマナーを守らない人だという事を忘れていました。 回答したことを後悔していますが、残念ながらここでは回答を取り消せません。 今後2度と回答しないように気を付けます。

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

No3の訂正です。 Nubering3()でSet uRowsの位置が違いました。 For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j Set uRows = Union(uRows, Ws2.Rows(WRow)) Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, j)) Next ↓ Set uRows = Union(uRows, Ws2.Rows(WRow)) For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, j)) Next

NuboChan
質問者

補足

ありがとうございます。 3つのSub()をテストしてみました。 (No3の訂正のコードを利用) Numberシートを表示した状態では、3個共に完動しますが、 DATAシートを表示した状態では、Sub Nubering3()でエラーが出ます。      実行時エラー'1004':   ’Union'メソッドは失敗しました:’_Goobal’オブゼクト    Set uRows = Union(uRows, Ws2.Rows(WRow)) -------------------

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

3個思いついたので3個とも出してみます。動作時の画面表示をオフにしました。 行を毎回計算します。行関係が変わった場合計算式を変更する必要がありそうです。 ↓ Sub Nubering1() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells((i - 1) * 2 - 1, j).Value = j ''Numeling 大文字、中央揃え Ws2.Cells((i - 1) * 2 - 1, j).HorizontalAlignment = xlCenter Ws2.Cells((i - 1) * 2 - 1, j).Font.Bold = True Ws2.Cells(i * 2 - 2, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Ws2.Cells(i * 2 - 2, j).HorizontalAlignment = xlCenter '中央揃え Ws2.Cells(i * 2 - 2, j).Borders.LineStyle = xlContinuous '罫線外枠 Next Next i Ws2.Range("A1:xx100").ColumnWidth = 3 ' Application.ScreenUpdating = True Set Ws1 = Nothing Set Ws2 = Nothing End Sub NumberシートのA列最終行を探して行を指定します。 ↓ Sub Nubering2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, WRow As Long Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row WRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row + 1 If Range("A1").Value = "" Then WRow = 1 End If For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j ''Numeling 大文字、中央揃え Ws2.Cells(WRow, j).HorizontalAlignment = xlCenter Ws2.Cells(WRow, j).Font.Bold = True Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Ws2.Cells(WRow + 1, j).HorizontalAlignment = xlCenter '中央揃え Ws2.Cells(WRow + 1, j).Borders.LineStyle = xlContinuous '罫線外枠 Next Next i Ws2.Range("A1:xx100").ColumnWidth = 3 ' Application.ScreenUpdating = True Set Ws1 = Nothing Set Ws2 = Nothing End Sub Nubering2()で毎回書式設定していたのをUnion利用して最後に一括で処理します。これが早いかもしれません。 ↓ Sub Nubering3() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, WRow As Long Dim uRows As Range, uRange As Range Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Set uRows = Rows(1) Set uRange = Range("A2") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row WRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row + 1 If Range("A1").Value = "" Then WRow = 1 End If For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j Set uRows = Union(uRows, Ws2.Rows(WRow)) Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, j)) Next Next i ''Numeling 大文字、中央揃え uRows.HorizontalAlignment = xlCenter uRows.Font.Bold = True '分割文字中央揃え罫線外枠 uRange.HorizontalAlignment = xlCenter uRange.Borders.LineStyle = xlContinuous 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 ' Application.ScreenUpdating = True Set Ws1 = Nothing Set Ws2 = Nothing Set uRows = Nothing Set uRange = Nothing End Sub

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

以下のコードで試してみてください。 Numberシートのクリア範囲は適当ですので適宜変更してください。 Numberシートの1行目の連番も入れてます。もとも入れている場合は Ws2.Cells(1, j).Value = j を無効にしてください。 Sub Test() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Ws2.Range("A1:XX100").ClearContents For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(1, j).Value = j Ws2.Cells(i, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Next Next i Set Ws1 = Nothing Set Ws2 = Nothing End Sub

NuboChan
質問者

お礼

kkkkmさん、今回も回答頂きありがとうございます。 アドバイスいただいたコードを一部改ざんして試してみたのですが 参考図のようにターゲットの文字列ごとにナンバリングしたいのですが   どのように修正すれば良いですか ? 参考図 https://imgur.com/gZJxSzL ------------------------------- 以下、改ざんコード Sub Nubering() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(1, j).Value = j Ws2.Cells(i, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Ws2.Cells(i, j).HorizontalAlignment = xlCenter '中央揃え Ws2.Cells(i, j).Borders.LineStyle = xlContinuous '罫線外枠 Next Next i 'Numeling 大文字、中央揃え Ws2.Rows("1:1").HorizontalAlignment = xlCenter Ws2.Rows("1:1").Font.Bold = True 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 ' Set Ws1 = Nothing Set Ws2 = Nothing End Sub

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

これなら、VBA を使わなくても、 A1: 1 A2: =MID(Data!A2,A$1,1) A2を下へコピペ。 纏めて右へコピペ。 でいいのでは。

NuboChan
質問者

お礼

SI299792さん、回答ありがとうございます。 だんだん欲が出て  処理が複雑になっていきそうなので関数だけでは処理が難しいそうです。

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

関連するQ&A

  • エクセルシートを半角・スペースなしに

    エクセルのシートに文字列・数字が入力されています。しかし文字や数字の間に空白があったり、全角・半角がバラバラに入力さています。 これを全て、半角でスペースをなくすにはVBAにどのように書けばよいのでしょうか?

  • VBAでナンバリング

    こんにちは。 はじめまして。 VBA初心者です。 教えてください。 VBAであるリストを作成しました。 その表のA列に列を加え、B列にデータがある間、「1、2、3、4、…」とナンバリングしたいと思っています。 列を加えることは出来たのですが、ナンバリングがいまいちうまくいきません。どうか、良い方法をお教えください。 よろしくお願いします。   A   B   C 1 No.  名前  住所 2 1  青野太郎 東京都 3 2  東野次郎 岡山県 4     

  • エクセル:文字列のバイト数が欲しい

    セルB1に、  半角スペース、全角2文字、半角スペース、 と入力しました。 このシートの別のセルに、 =Len(B1)と入力すると4と表示され、 =LenB(B1)と入力すると6と表示されますので、 間違いなく「半角スペース・全角2文字・半角スペース」がB1に入っているはずです。 このシートのコードに、 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Address = "$L$1" Then     MsgBox LenB(Cells(1, 2).Value)   End If End Sub と打ちました。 ここでシート上のセルL1に何か入力するとメッセージボックスが出るのですが、 メッセージボックスに出る値は8です。 何が原因でしょうか。 6が表示されて欲しいのですが(文字列のバイト数が欲しい)、 どのようにコードを書けばよいでしょうか。 実際にB1に入れていた文字は、 1B です。 (半角スペース・全角数字1・全角英字B・半角スペース)

  • Excel2010:文字列の表示

    Excel2010で、添付画像のような文字列があるとき、V列に以下のような規則で表示することはできるでしょうか? ■規則 英数字は半角 カタカナは全角 スペースは全角 ハイフンは半角 ハイフン以外の記号は全角 それ以外は全角 自分としては、難しいのでたいしたお礼は言えないと思いますがよろしくお願いします。 回答よろしくお願いします。

  • Excelでの自動ナンバリング後の印刷について

    自分がやりたい事はExcelでブックを開く度にナンバリングが自動生成され、都度印刷の度に部数に応じてその数が自動で加算されていくというようなものです。 過去の質問において下記のような回答を見つけました Private Sub Workbook_Open() Dim cnt As Long Dim シート名, セル, 文字列 As String シート名 = ActiveSheet.Name セル = "B2" '←ナンバーを入れるセル(Range("C2")なら"C2")…(1) cnt = Len(Sheets(シート名).Range(セル)) If cnt = 0 Then Sheets(シート名).Range(セル) = "No." & Format(InputBox("発行No.の初期値をセットしてください。"), "0000") Else 文字列 = Right(Sheets(シート名).Range(セル), cnt - 3) cnt = Val(文字列) cnt = cnt + 1 Sheets(シート名).Range(セル) = "No." & Format(cnt, "0000") '←桁数をセット(5桁なら"00000")…(2) End If End Sub 上記の記述は自分のやりたい事とほぼ一致しているのですが、この場合では複数枚印刷すると同じナンバリングの用紙がでてきてしまいます。 例えば、ブックを開いた際に自動生成された数がNo.0005だとして、10枚印刷した場合にNo.0005から連番で印刷され、次回ブックを開いた際にNo.0015から始まるといったような事です。 別シート等を使うような方法でも構わないので何か良い方法はありますでしょうか? また不特定多数の人が出力した際に上書き保存をして終了しない人がいた場合等は上記の記述でのナンバリングは成立しませんが、そのような環境において通しでのナンバリングを成立させる方法はありますでしょうか?(Excel以外になったとしても) 解りにくいかもしれませんが、ご教授頂ければ幸いです。

  • (VBA)文字列の最後のスペース及びーを削除

    (VBA)文字列の最後のスペース及びーを削除 2021/09/01 11:35 offie_2019,windows10 ちょっと紛らわしい質問なのですが 例えば、E列に文字列が数十行あって  それぞれの文字列の最後が下記のよう場合  不必要なスペースと-を削除したいのですが何か方法がありますか ? (視認性を良くするために   半角又は全角のスペースを□で表します。) -は、半角若しくは全角 それぞれ削除した文字列をE列の横のF列に書き出す形式を考えています。 takano□- takano- takano□- takano□-□ takano. takano.□ takano□(vol.2)□- 不必要削除後は、 takano takano takano takano takano. takano. takano takano□(vol.2) 一例の参考画像を下記に添付しました

  • エクセルシートの文字列加工について

    エクセルのシートのA列に"全角ひらがな漢字"の文字列と"半角英数"の文字列を含むセルが縦に並んでいます。約200行。 ■この中から、"全角ひらがな漢字"の文字列を右となりのB列に、"半角英数"の文字列をさらに右となりのC列に、それぞれコピーしたいのですが、関数・マクロなどでいい方法がありましたら教えて下さい。 ■それから、半角英数文字列のC列から、""で囲まれた文字列のみをさらにD列にコピーしたいのです。 文字列の長さが統一されていれば、比較的簡単なのですが、今回は文字列の長さが不規則です。よろしくお願いします。

  • splitを使ってスペース位置で文字列を区切りたい

    splitを使ってスペース位置で文字列を区切りたいのですが、 String[] word = str.split(" ",0);  //半角空白 のように書くと、全角スペースは区切りとしてみなされず、 String[] word = str.split(" ",0);  //全角空白 のように書くと、半角スペースは区切りとしてみなしてくれません。 全角スペースでも半角スペースでも、スペース位置で文字列を区切りたいのですが、どのように書けばよいのでしょうか?

    • ベストアンサー
    • Java
  • Excel VBAで、特定半角文字のみ全角文字に変換したい。

    Excel VBA で、 A列に半角、全角が混在した文字列及び数字が入っています。 ファイル名に出来ない半角文字 \ / : * ? " < > | だけを全角文字にするには、 どのようなコードを書けば良いのか、宜しくお願いします。

  • ワードのワイルドカードを使った置換について

    ワードでワイルドカードを使って置換をしたいのですが、うまくいきません。 数字の前の全角スペースを半角スペースに変えたいのです。 置換でワイルドカードを使用するにチェックを入れ、 検索する文字列は「全角スペース[0-9]」 置換後の文字列は「半角スペース\1」 として実行してみたのですが、 〔置換後の文字列〕に指定できない範囲の番号が含まれています というメッセージが出ます。 全角スペース[0-9]はきちんと認識しているようで、検索まではうまくいっているようですが、 置換後の指定の仕方が悪いようなのです。 お教えいただければと思います。 よろしくお願いいたします。

デート後に過食をしたくなる
このQ&Aのポイント
  • デート後に過食をしてしまう癖があり、後悔や自己嫌悪がつらい。
  • 食べることが好きな恋人とのデートでたくさん食べてしまうが、一人になると食べたくて仕方ない気持ちになる。
  • 同じような経験をされた方やアドバイスを求めています。
回答を見る

専門家に質問してみよう