文字変換マクロの使い方と対応範囲について

このQ&Aのポイント
  • 文字変換マクロは、数値を文字列に変換するマクロです。
  • 行数や列数が増えても対応できるように作られています。
  • 具体的な使い方や対応する範囲について教えてください。
回答を見る
  • ベストアンサー

文字変換マクロについて

数値を文字列に変換するマクロで、行数や列数が増えても対応できるようにしたいです。 (並びは…数値 スペース 文字列)どなたか教えてください。 よろしくお願いします。 Sub 文字() Dim i As Long For i = 1 To Range("A1").End(xlDown).Row Cells(i, "C") = Cells(i, "A") With Cells(i, "C") .NumberFormatLocal = "@" .Value = StrConv(Cells(i, "C").Value, vbNarrow) .Value = Format(Cells(i, "C").Value, "'00") End With Next i End Sub

この投稿のマルチメディアは削除されているためご覧いただけません。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.1

こんな感じでしょうか。 ループの回数指定にEnd(xlDown).Rowを使うのはその列の2行目以降にデータがない場合最大行数が返って怖いのでEnd(xlUp).Rowにしています。下にデータがある場合はRows.Countを下のデータの一行上に指定するか、もとのEnd(xlDown).Rowを利用してください。 同じように列方向もEnd(xlToLeft).Columnにしています。 Sub 文字() Dim i As Long, j As Long, k As Integer j = Cells(1, Columns.Count).End(xlToLeft).Column Debug.Print j For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row Cells(i, j + 2).Resize(1, j).Value = Cells(i, "A").Resize(1, j).Value For k = 1 To j With Cells(i, k + j + 1) .NumberFormatLocal = "@" .Value = StrConv(Cells(i, k + j + 1).Value, vbNarrow) .Value = Format(Cells(i, k + j + 1).Value, "'00") End With Next k Next i End Sub

blackcat77
質問者

お礼

回答ありがとうございました。助かりました。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 回答no.2です。  他にも、繰り返し処理を使わずに、ワークシート関数を使って一気に値を算出させてから、得られた値のみを同じセル範囲に入力しなおすという方法もあります。 Sub QNo9233753_文字変換マクロについて_2() Const FirstCell = "A1" Dim myRange As Range, myOffset As Long With Range(FirstCell) myOffset = Range(.Offset(0), Cells(.row, Columns.Count).End(xlToLeft)).Columns.Count Set myRange = Range(.Offset(0), Cells(Rows.Count, .column).End(xlUp)).Resize(, myOffset).Offset(, myOffset + 1) End With myOffset = myOffset + 1 With Application .ScreenUpdating = False .Calculation = xlManual End With With myRange .FormulaR1C1 = "=IF(RC[-" & myOffset & "]="""","""",TEXT(RC[-" & myOffset & "],""00""))" .Parent.Calculate .NumberFormatLocal = "@" .Value = .Value End With With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 For ~ To ~ NextではなくFor Each ~ in ~ Nextを使って繰り返し処理をされると良いです。 Sub QNo9233753_文字変換マクロについて() Const FirstCell = "A1" Dim c As Range, myRange As Range, myOffset As Long With Range(FirstCell) myOffset = Range(.Offset(0), Cells(.row, Columns.Count).End(xlToLeft)).Columns.Count Set myRange = Range(.Offset(0), Cells(Rows.Count, .column).End(xlUp)).Resize(, myOffset) End With myOffset = myOffset + 1 With Application .ScreenUpdating = False .Calculation = xlManual End With myRange.Offset(, myOffset).NumberFormatLocal = "@" For Each c In myRange c.Offset(, myOffset).Value = Format(c.Value, "00") Next c With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub  因みに上記のVBAの中の With Application .ScreenUpdating = False .Calculation = xlManual End With という箇所と With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With という箇所は処理を高速化するために設けているものですので、もし処理速度が若干遅くなっても良い場合には、次の様に簡略化してしまっても構いません。 Sub QNo9233753_文字変換マクロについて() Const FirstCell = "A1" Dim c As Range, myRange As Range, myOffset As Long With Range(FirstCell) myOffset = Range(.Offset(0), Cells(.row, Columns.Count).End(xlToLeft)).Columns.Count Set myRange = Range(.Offset(0), Cells(Rows.Count, .column).End(xlUp)).Resize(, myOffset) End With myOffset = myOffset + 1 myRange.Offset(, myOffset).NumberFormatLocal = "@" For Each c In myRange c.Offset(, myOffset).Value = Format(c.Value, "00") Next c End Sub

blackcat77
質問者

お礼

できました。解説ありがとうございました。

関連するQ&A

  • エクセル マクロ 抽出

    教えてください。 ○と記入されたセルを参照して、一つ上のセル・A列にある同じ行のセル・ 9行目にある同じ列のセルを抽出しようとしています。 下記の通り入力すると 行数=値.Rowでエラーが出たしまいました。 試行錯誤頑張りましたが解決できそうにありませんのでお力を貸して頂けないでしょうか。 Sub 抽出() Dim i, 行数, 列数 As Long Dim 値 As Range i = 0 行数 = 値.Row 列数 = 値.Column For Each 値 In Sheets("sheet1").Range("C12:R171") If 値.Value = "○" Then i = i + 1 With Sheets("sheet2") .Cells(i, 3).Value = Sheets("sheet1").Cells(行数, 1).Value .Cells(i, 4).Value = Sheets("sheet1").Cells(9, 列数).Value .Cells(i, 5).Value = 値.Offset(-1, 0).Value End With End If Next End Sub

  • 下記のマクロはC列5行目から文字の

    下記のマクロはC列5行目から文字の入っている最後の行までの範囲で セル内に蜜柑や林檎、苺の文字が入っていたら同一行のA列にも蜜、林、苺 の文字を入れるというマクロなのですが・・・ たとえばC列12行目が 『蜜柑林檎苺』 となっていた場合、A列に入る言葉は『苺』となり『蜜』『林』という言葉が 消えてしまいます。 そこでこのマクロを少し改造して、 C列が『蜜柑林檎苺』や『蜜柑苺』となっている場合 A列に入る言葉は『蜜林苺』ないし『蜜苺』という風に積み重ねていくように改造はできないでしょうか? ↓この部分を改造すればできるようになりますか? Cells(i, 2).Offset(0, -1).Value = "蜜" Sub 蜜柑林檎苺() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "蜜柑") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "蜜" End If If InStr(.Cells(i, "C"), "林檎") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "林" End If If InStr(.Cells(i, "C"), "苺") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "苺" End If Next i End With End Sub

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • エクセル マクロ:文字変更

    教えてください。 sheet5にデータがあります。 マクロを実行すると、一番右の列のセルに○があると●と書き換える 一番右の列のセルに△があると▲と書き換えるコードを作成しています。 下記のコードでは時間がかかってしまいます。 省略 If Sheets("sheet5").Cells(r, cmax).Value = "○" Then Sheets("sheet5").Cells(r, cmax).Value = "●" 省略 AutoFilterを使用してマクロを作成しましたが、列に○と△が両方無いと 範囲指定したセルがすべて▲となってしまいます。 下記コードをどのように手直ししたらよいのか教えて頂けないでしょうか。 よろしくお願いします。 Sub 文字変更() Dim c As Integer Dim cmax As Integer Dim rmax As Long With Sheets("sheet5") rmax = .Range("A3").End(xlDown).Row cmax = .Range("A3").End(xlToRight).Column .Rows("1:1").Select Selection.AutoFilter For c = 2 To cmax Selection.AutoFilter Field:=c, Criteria1:="○" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "●" Selection.AutoFilter Field:=c, Criteria1:="△" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "▲" Selection.AutoFilter Field:=c Next c End With Selection.AutoFilter End Sub

  • 上のセルのコピーのマクロについて

    下記コードで、B列(数値)の空白のセルにその上の値をコピーしているんですが、C列(日付)で行ったところ、できませんでした。 Integerが違うと思って変えたんですが、ほかにも関連して変えるところがありますか?? 宜しくお願いいたします。 Sub 上のセルコピー() Dim i As Integer For i = 1 To Range("B" & Rows.Count).End(xlUp).Row If Cells(i, 2).Value = "" Then Cells(i, 2).Value = Cells(i - 1, 2).Value End If Next i End Sub

  • vba セルの行頭に連番を付加

    セルの行頭に連番を付加したいので下記のようなコードを作成しました。 B列をナンバリング用の仮セルとして使いましたが 仮セルを利用しない方法はありますか ? Option Explicit Sub セル連番付加() Dim i As Long For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row With Cells(i, "B") .Value = i - 1 .NumberFormatLocal = "@" .Value = Format(.Value, "00") End With Cells(i, "C") = Cells(i, "B") & " " & Cells(i, "A") Next End Sub

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • 以下のマクロは、一応簡単な文字チェックマクロなのですが・・・

    L列の5行目から文字の入っている最後の行の範囲で、 L列に『等』という文字が入っているセルで M列に『トウ』の文字が入っていない場合は、MsgBoxを出すというマクロです。 Private Sub 等_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "L").End(xlUp).Row '『i』はD列の5行目から文字の入っている最後の行をいう(行の範囲) If InStr(.Cells(i, "L"), "等") > 0 Then If InStr(.Cells(i, "M"), "トウ") = 0 And .Cells(i, "M") <> "" Then MsgBox i & "行" End If End If Next i End With End Sub これに少し付け加えて、 L列に『等』が2回出てきたら、M列は『トウ』を2回出てこないとMsgBoxを出すようにしたいのですが、どのようにすればよいでしょうか? 例えば L列7行目 柑橘類等や野菜類等 M列7行目 カンキツルイトイヤヤサイルイトウ ※ ひとつ目の『等』のヨミが『トイ』となっていますが、上記のマクロですと ヨミの最後の『トウ』に反応してスルーしてしまいます。 完璧なヨミチェックはマクロでは無理かと思いますが、このくらいはスルーしないマクロを何とかゲットしたいです。。。

  • マクロ:データの抽出(複数条件)

    エクセルで以下のようなマクロを作成しました。 シート1のG列がシート2のF4と合致する時、シート2のC列にシート1のB列を貼り付けるのですが、条件を増やし 「シート1G列がシート2のF4と一致」かつ「シート1H列がシート2のG5と一致」かつ「シート1I列がシート2のH5と一致」かつ・・・としたいのですが、If Thenをどのように記述したらよろしいでしょうか。(AND関数の機能です) 宜しくお願いいたします。 Sub data01() With Sheets("Sheet1") x = .UsedRange.Cells(.UsedRange.Count).Row For i = 5 To x If .Cells(i, "G").Value = Worksheets("Sheet2").Range("F4").Value Then n = n + 1 Sheets("Sheet2").Cells(n + 5, "C").Value = .Cells(i, "B").Value End If Next End With End Sub

  • VBA 文字セルに数値を一緒に表示させるには

    OSはXPpro、 Excelは2003を使用しています。 図の様な表で、F列の様な内容で、D列にC列の数値と合わせて表示させたいのですが、 Sub test() Dim i As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 4) = "一部" Then Cells(i, 4) = Cells(i, 4) + Cells(i, 3) End If Next i End Sub ですと、『型が一致しません』と出てデバックになってしまいます。 文字の数値を合わせるにはどの様にすればいいでしょうか? ご教示お願い致します。

専門家に質問してみよう