• ベストアンサー

それぞれテキストファイに区切って出力

添付画像のような構成で  C列数値(D列の文字数の総計)を上から順番に合計して300を超えるとB列にその合計を書き出すようにしました。  (コード SumIfOver300) わかりやすいようにA列にそれぞれを塗分けしています。 1) 現在は、手動ですがこれをVBAで自動で処理したい。 (添付図は、3色ですが境目が解ればいいので2色でもOKです。) 2) 塗分け後に塗分けされたD列の部分を一つのテキスト群としてそれぞれ別ファイル(テキストファイル)に区切って出力したい。 添付図で言うといかのように出力  D2:D7  001_text.txt D8:D12 002_text.txt D13:D15 003_text.txt Sub SumIfOver300() Dim lastRow As Long Dim sum As Long Dim i As Long lastRow = Cells(Rows.Count, "C").End(xlUp).Row sum = 0 For i = 1 To lastRow sum = sum + Cells(i, "C").Value If sum > 300 Then Cells(i, "B").Value = sum sum = 0 End If Next i End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1633/2476)
回答No.28

>  </i>は、 >   fileContent = Replace(fileContent, "/", "%EF%BC%8F") >   実際は、< / i>に先に変換されているので無駄なコードになっているようです。 上記を fileContent = Replace(fileContent, "</i>","") の後に実行すればいいのではないですか。 置換の順番は、文字数の多いものから先にするといいのではないでしょうか。 ただ 「%」は必ず一番最初に置換 は、あのグループの中で他の置換の結果に「%」が含まれるから、それを置換しないようにするためです。 > 事前にReplaceで削除しておきたいのですが > どのようなコードになりますか ? fileContent = Replace(fileContent, "</i>","") と同じようにすればいいと思います。

NuboChan
質問者

お礼

ありがとうございます。 難しく考えていました。 アドバイスのように削除記号をひとつずつコードで追加すれば良いのですね。 ( <*> のようにワイルドカード的な処理を想定していました。) 以下のコードに変更してしばらくテストしてみます。 fileContent = Replace(fileContent, "%", "%25") fileContent = Replace(fileContent, "<i>", "") fileContent = Replace(fileContent, "</i>", "") fileContent = Replace(fileContent, "<b>", "") fileContent = Replace(fileContent, "</b>", "") fileContent = Replace(fileContent, "<BR>", "") fileContent = Replace(fileContent, "#", "%23") fileContent = Replace(fileContent, "/", "%EF%BC%8F") pStr = Replace(Replace(Replace(fileContent, vbCr, "%0D"), vbLf, "%0A"), " ", "%20") ’---------------------------------------------

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

その他の回答 (27)

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

o.6の訂正です。 > セルの形式が文字列ではないセルがあるたびに 「たびに」じゃなくて、あれば「A1から最終行まで一巡して、セルの書式をテキストに変更以降」を実行し、その後、形式が文字列ではないセルは現れなくなるので、「たびに」じゃなくなりますね。 ただ、ループはどちらかだけでいいと思います。

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

> For Each cell In Range("A1:A" & lastRow) > If cell.NumberFormat <> "@" Then > For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row これだと、A1から最終行までを一巡しながら、セルの形式が文字列ではないセルがあるたびに、「A1から最終行まで一巡して形式を文字列に」を繰り返しています。 ループはどちらかだけでいいと思います。

NuboChan
質問者

お礼

コードを以下のように修正しました。 For Each cell In Range("A1:A" & lastRow) If cell.NumberFormat <> "@" Then 'A列のセル書式設定が文字列で無い場合 cell.NumberFormatLocal = "@" 'セルの書式をテキストに変更 If Left(cell.Formula, 1) = "=" Then 'セルのフォーミュラが"="で始まる場合 cell.Value = Mid(cell.Formula, 2) 'セルの値をフォーミュラの2番目以降の文字列に変更 End If cell.Value = cell.Formula End If Next cell 英文を日本語に翻訳するのにDeepLを利用したいのですが 無料版の場合1度に翻訳できる文字数が5000文字までで長文の場合(映画の英語字幕等)では 複数に区分けして処理する必要があります。 EXCELで複数のテキストファイルに分割までは成功しましたが これを自動で複数ファイルを順番にDeppLに引き継いで翻訳させるのがこれからの課題となります。 調べれば参考になりそうなURLがそこそこ見つかりますが https://qiita.com/KYUPHD/items/8edb740bcb9c59459c93 素人の私には、難易度が高く簡単ではありません。 もう少し調べて先が少し見えそうなら改めて相談させていただきます。

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

現状のデータを文字列指定に直すとしたら、以下でできると思います。範囲に数式そのものはないものとします。 Sub test() Dim i As Long For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 1).NumberFormatLocal = "@" If Left(Cells(i, 1).Formula, 1) = "=" Then Cells(i, 1).Value = Mid(Cells(i, 1).Formula, 2) End If Cells(i, 1).Value = Cells(i, 1).Formula Next End Sub

NuboChan
質問者

お礼

ありがとうございます。 コードを参考に以下のように改造してみました。 Sub CountCharacters() Dim i As Long Dim lastRow As Long Dim cell As Range Dim temp As Variant lastRow = Cells(Rows.Count, 1).End(xlUp).Row 'A列のセル書式設定が文字列であるかどうか For Each cell In Range("A1:A" & lastRow) If cell.NumberFormat <> "@" Then For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row 'セルの書式をテキストに変更 Cells(i, 1).NumberFormatLocal = "@" 'セルのフォーミュラが"="で始まる場合 If Left(Cells(i, 1).Formula, 1) = "=" Then 'セルの値をフォーミュラの2番目以降の文字列に変更 Cells(i, 1).Value = Mid(Cells(i, 1).Formula, 2) End If Cells(i, 1).Value = Cells(i, 1).Formula Next End If Next cell '1行の文字数カウント>書き出し For i = 1 To lastRow Set cell = Cells(i, 1) cell.Offset(0, 1).Value = Len(cell.Value) Next i '列入れ替え(2列目を1列目と入れ替え) For i = 1 To lastRow temp = Cells(i, 1).Value Cells(i, 1).Value = Cells(i, 2).Value Cells(i, 2).Value = temp Next i '先頭に空列を2つ挿入 '1行目に空行を1つ挿入(見出し行) Columns("A:B").Insert Shift:=xlToRight Rows("1:1").Insert Shift:=xlDown '見出し行 Range("A1") = "塗分け" Range("B1") = "総文字数" End Sub

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

> Excelが計算式と判断して 「=- Kind of the highlight of her day.」とイコール(=)を先頭に付加してしまっています。 最初にセルの表示形式を「文字列」にしてからデータを入れるようにしてみてください。他にもありそうな、文字列と判断されないようなデータも、文字列として判断されると思います。 以下の部分ですが、cellってここでしか使われてないと思います cellにせずにCells(i, 1)のままでいいのではないでしょうか。 For i = 1 To lastRow Set cell = Cells(i, 1) cell.Offset(0, 1).Value = Len(cell.Value) Next i 1行の文字数カウント>書き出し と '列入れ替え(2列目を1列目と入れ替え) は一度のループで済ませられるような気もします。 もしくは、最初にA列の前に1列挿入(もしくは3列挿入、最後の2列もここで行う)して 1行の文字数カウント>書き出し を行ってもいいのではないでしょうか。

NuboChan
質問者

お礼

修正コードありがとうございます。 以下のコードでマイナスの場合「'」を付けて強制的に文字列にしようと思いましたが A列にテキストを読み込んだ(コピペ)した時点で#NAME?のエラーなので マクロで修正する以前の問題だと気がつきました。 For Each cell In Range("A1:A" & lastRow) If Left(cell.Value, 1) = "-" Then cell.Value = "'" & cell.Value End If Next cell 現時点では、 テキストエディター(EmEditor)で最初の文字がマイナスなら削除する事で 事前に処理するぐらいしか思いついていません。

NuboChan
質問者

補足

>最初にセルの表示形式を「文字列」にしてからデータを入れるようにしてみてください。 そうでした。 セルの書式設定で処理できる事例でした。 悩み始めると修正が効かずにあらぬ方向に思考が進んでしまいました。 おかげさまで、無事テキストに分割できました。

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

質問範囲外ですが、まず回答者はテストデータが必要。 (テストするには、データ例を作ることは、やらざるをえない。手数がかかるのですよ。) C列の各行に適当数(80以下ぐらい?)を入力。この情報も質問に書くべきです。 手抜きのための思い付きで、D列に=REPT("A",C1) と言う関数を入れて下方向に式を複写。 そのデータ例 B,C,D列 8 AAAAAAAA 67 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 72 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 73 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 71 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 303 12 AAAAAAAAAAAA 51 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 53 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 71 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 84 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 322 63 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ーーー 常套手段のFor Nextで各行処理をする。 標準モジュールに Sub test01() lrw = Range("C10000").End(xlUp).Row 'clrindx = Array(0, 6, 3, 5) 'MsgBox lrw stotl = 0 'B列 mrw = 1 '直前の変化後行 j = 1 'Colorindex値 'ーーーー For i = 1 To lrw stotl = stotl + Cells(i, "C") If stotl >= 300 Then '300行を超えると MsgBox i Cells(i, "B") = stotl 'B列に各累計値セット Range("A" & mrw & ":A" & i).Interior.ColorIndex = j: j = j + 1 'セル範囲に色づけ mrw = i + 1 stotl = 0 Else End If Next i 'ーーー '最終行後処理 Cells(i - 1, "B") = stotl Range("A" & mrw & ":A" & i - 1).Interior.ColorIndex = j End Sub を作る。 そして実行。結果は略。 ここまでが質問の前段階。 ====================== 後は、A列の同一色の入った行をまとめて1テキストファイルとして、全体では、複数ファイルに書き出す。 上記コードに、下記を組み込むことも可能だが、上記終了後に改めて行う方式にする。 テスト時に、Msgbox 行は表示が「しつこい」ならば、データ行を少なくするか、すべて削除してください。本番では不要だろう。 標準モジュールに Sub test02() 'テキストファイル書き出し lrw = Range("C10000").End(xlUp).Row MsgBox lrw '--初期設定 stotl = 0 'B列について mrw = 1 '直前の変化した行 j = 1 'ファイル名の番号の開始期数字 'ーーーー For i = 1 To lrw stotl = stotl + Cells(i, "C") If stotl >= 300 Then '300行を超えると MsgBox i flnam = "testf" & j 'ファイル名は "textf" & j にすると仮定 MsgBox flnam '--- Open "C:\Temp\" & flnam & ".txt" For Output As #1 For k = mrw To i Print #1, Cells(k, "D").Value MsgBox Cells(k, "D").Value Next k Close #1 stotl = 0 mrw = i + 1 j = j + 1 'ファイルンの名前番号部を+1 Else End If Next i '----行の終了後ーーーーー '----最終分ファイルへ書き出し flnam = "testf" & j 'ファイル名は 続きの"textf" & j MsgBox flnam Open "C:\Temp\" & flnam & ".txt" For Output As #1 For k = mrw To i - 1 Print #1, Cells(k, "D").Value MsgBox Cells(k, "D").Value Next k Close #1 End Sub テストデータとテスト回数は十分でないの、後はよろしく。 やって見ただけ(説明文の用意など)数時間必要だった)で、自分にとって新しいものは無いやり方となった。

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

No.1の追加です。 C列数値(D列の文字数)もVBAで出すのでしたら 最終行をD列から lastRow = Cells(Rows.Count, "D").End(xlUp).Row 2行目から For i = 2 To lastRow Cells(i, "C").Value = Len(Cells(i, "D").Value) '←追加 sum = sum + Cells(i, "C").Value If sum > 300 Then に変更してください。

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

以下で試してみてください。 Sub SumIfOver300() Dim lastRow As Long Dim sum As Long Dim i As Long Dim FRow As Long Dim FCount As Long Dim mColor As String lastRow = Cells(Rows.Count, "C").End(xlUp).Row sum = 0 FRow = 2 FCount = 1 mColor = "red" For i = 1 To lastRow sum = sum + Cells(i, "C").Value If sum > 300 Then Cells(i, "B").Value = sum mColor = mColorSet(mColor, FRow, i) Call mTxtFile(FCount, FRow, i) FCount = FCount + 1 FRow = i + 1 sum = 0 End If Next i If FRow <= lastRow Then mColor = mColorSet(mColor, FRow, lastRow) Call mTxtFile(FCount, FRow, lastRow) End If End Sub Function mColorSet(ByVal mColor As String, ByVal FRow As Long, ByVal i As Long) As String If mColor = "red" Then Cells(FRow, "A").Resize(i - FRow + 1, 1).Interior.Color = vbGreen mColorSet = "green" Else Cells(FRow, "A").Resize(i - FRow + 1, 1).Interior.Color = vbRed mColorSet = "red" End If End Function Function mTxtFile(ByVal FCount As Long, ByVal FRow As Long, ByVal ERow As Long) Dim FName As String Dim j As Long FName = Format(FCount, "000_text.txt") Open "C:\OK\" & FName For Output As #1 For j = FRow To ERow Print #1, Cells(j, "D").Value Next Close #1 End Function

NuboChan
質問者

お礼

kkkkkmさん、毎回教えていただきありがとうございます。 おしえていただいたコードの色を2つのグレー(薄い、濃い)に塗分けるように変更してうまく処理できるのを確認しました。 総数300文字はサンプルなので実例の4900に変更して実際のテキスト文字列をターゲットにして 添付画像のような形式に変更するためテキスト文字列をA列に配置してマクロ(CountCharctors)を起動させてみました。 途中までは変換されましたが、以下コードで「形が一致しません」がでました。 cell.Offset(0, 1).Value = Len(cell.Value) チェックすると該当箇所はセル表示が#NAME?と表示されています。 実際の文字列は、-(マイナス)で始まる 「- Kind of the highlight of her day.」なので Excelが計算式と判断して 「=- Kind of the highlight of her day.」とイコール(=)を先頭に付加してしまっています。 このため、単純なテキストもじと判断されずにエラーが表示されるのだと思います。 これを防ぐには、どうしたらいいでしょうか ? (実例では、他にも文字列として判断されない事例が出てくる可能性がありそうです。) Sub CountCharacters() Dim i As Long Dim lastRow As Long Dim cell As Range Dim temp As Variant lastRow = Cells(Rows.Count, 1).End(xlUp).Row '1行の文字数カウント>書き出し For i = 1 To lastRow Set cell = Cells(i, 1) cell.Offset(0, 1).Value = Len(cell.Value) Next i '列入れ替え(2列目を1列目と入れ替え) For i = 1 To lastRow temp = Cells(i, 1).Value Cells(i, 1).Value = Cells(i, 2).Value Cells(i, 2).Value = temp Next i '先頭に空列を2つ挿入 '1行目に空行を1つ挿入(見出し行) Columns("A:B").Insert Shift:=xlToRight Rows("1:1").Insert Shift:=xlDown '見出し行 Range("A1") = "塗分け" Range("B1") = "総文字数" End Sub

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

関連するQ&A

  • エクセルVBAにてテキスト出力がうまくいきません

    エクセルシートの1列に以下のような文字列を打ち込みました。 - a aa aaa aaaa aaaaa - b bb bbb bbbb bbbbb - c cc ccc cccc ccccc - 「-」の2行後をテキストを出力した際のファイル名とし、ファイル名を含んだ次の「-」までの文字列をそのテキストの中に出力したいです。なお、全体の行数は分かっています。 例えば上の文字列に対して実行すると、 a.txt b.txt c.txt というファイルができ、それぞれの中には a aa aaa aaaa aaaaa などがそれぞれ出力されるようにしたいです。 Sub tepa() Dim strFilename As String Dim FileNumber As Integer Dim strREC As String j = 1 For i = 1 To 70 If Cells(i, 1) = "-" Then strFilename = Cells(i + 2, 1) & ".txt" Do While Cells(i + j, 1) <> "-" If i > 70 Then Exit Sub End If FileNumber = FreeFile strREC = Cells(i + j, 1) Open strFilename For Append As FileNumber Print #FileNumber, strREC Close j = j + 1 Loop End If i = i + j Next End Sub さきほど初めてVBAなるものを知り、見よう見まねで書いてみましたが・・・ループに陥ったりテキストファイルが1つめしか出力されなかったりとうまくいきません。 改善点など教えていただけたら嬉しいです。 よろしくお願いします。

  • EXCELVBAでデータをテキストファイルで出力したいと

    EXCELVBAでデータをテキストファイルで出力したいと考えています。 ***************************** 作成したVBA ***************************** Sub test_Click() Dim fNAME As String fNAME = "c:\test.txt" Open fNAME For Output As #1 i = 1 Print #1, "<test=" & Cells(1, i) & "," & Cells(2, i) & "," & Cells(3, i) & "," & Cells(4, i) & "," & Cells(5, i) & ">" Close #1 '閉じる End Sub ***************************** エクセルの値 ***************************** A列 1 2 3 4 5 ***************************** 出力されたテキストファイル ***************************** <test=1,2,3,4,5> このようになっていますが、 エクセルが A列 1 2 のように、2個しかないと、 <test=1,2,,,> のようになってしまいます。 <test=1,2> ↑のようになるように、エクセルの値に応じて、 「,」が出力しないようにしたいです。 どうしたらよいのでしょうか。 よろしくおねがいします。

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

  • VBAで文字列のカウントがうまくいかない・・・です

    Dim cnt As Long Dim i As Long Dim lastRow As Long For i = 1 to 20 step 2 lastRow = Cells(65536, i).End(xlUP).Row cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(10, i),Cells(lastRow, i), "お世話になっております")cnt = cnt + cnt Next Excelのセルを1列ずつ飛ばして列に「お世話になっております」が含まれたら件数をカウントしています。 そのカウント数が何故かリセットされてしまいます。 カウント数を足していきたいのですが・・・考え方自体が違うのでしょうか?

  • VBAでDateaddの日付計算で困っていることがあるので助けていただけないでしょうか。よろしくお願いします。

    シート: A列には”注射”という文字を入れるようにします。 B列には1月1日から12月31日まで入っています。 C列はB列の90日後を入れるようにします。 D列はC列の3日前を入れます。・・・としたいのですがその3日の間A列に”注射”が入っていたらその日を入れずに3日前にしたいのです。 稼働日みたいな感じでしょうか・・・・ どうしたらよいでしょうか?お願いします。 例えば、B列の「1月1日」の90日後はC列「3月31日」でD列は通常「3月28日」が入っていますがB列「3月30日」の左のA列に”注射”があったらそこを無視して「3月27日」と入れたいのです。 Sub count() Dim i As Long Dim lastrow As Long lastrow = Range("B1").End(xlDown).Row For i = 1 To lastrow Cells(i, 3).Value = DateAdd("d", 90, Cells(i, 2).Value) Next For i = 1 To lastrow Cells(i, 4).Value = DateAdd("d", -3, Cells(i, 3).Value) Next End Sub 説明が下手なのでもしよかったら実際作ったものを見ていただいた方が分かるかもしれません。 http://briefcase.yahoo.co.jp/bc/robert_kubica_bmw/vwp2?.tok=bcf8oGbB4FXgt88k&.dir=/&.dnm=1count.xls&.src=bc

  • 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 宜しくお願い致します。

  • VBAデータ元から新規ブックに出力

    現在のブック内に出力されるとメモリの都合上時間がかかりすぎますそこで新規ブック1個に出力する構文を教えていただきたいのですが、宜しくお願いします。 Sub 1111() Dim c As Range Dim i As Integer, LastRow As Long Dim NewSheetName As String, MatchFlag As Boolean Application.ScreenUpdating = False NewSheetName = "" With Sheets("データ元") For Each c In .Range(.Cells(3, "B"), .Cells(Rows.Count, "B").End(xlUp)) MatchFlag = False If NewSheetName <> Year(c.Value2) & "年" & Month(c.Value2) & "月" Then NewSheetName = Year(c.Value2) & "年" & Month(c.Value2) & "月" For i = 1 To Worksheets.Count If Sheets(i).Name = NewSheetName Then Sheets(i).Cells.ClearContents MatchFlag = True Exit For End If Next i If MatchFlag = False Then Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = NewSheetName End If End If LastRow = Sheets(NewSheetName).Cells(Rows.Count, "A").End(xlUp).Row Sheets(NewSheetName).Cells(LastRow + 1, "A").Resize(1, 6).Value = .Cells(c.Row, "A").Resize(1, 6).Value Sheets(NewSheetName).Columns("A:F").EntireColumn.AutoFit '↑A列からF列まで自動幅調整してます Next .Activate End With Application.ScreenUpdating = True MsgBox "終了しました", vbInformation End Sub

  • エクセル VBA テキストデータ書きだし

    お世話になっております。 エクセルのデータに記入したデータをテキストに書き出したいのですが、検索した結果、 A列だけテキスト化には成功したのですが、複数列(A-U)までコピーしたいのです。 シート名"メール" テキスト名"テキスト" 申し訳ございませんが、よろしくお願いします。 Sub テキスト() Dim StrFN As String StrFN = ActiveWorkbook.Path & "\テキスト.txt" Dim i As Long, LngLoop As Long Dim IntFlNo As Integer Worksheets("メール").Activate LngLoop = Range("a65536").End(xlUp).Row IntFlNo = FreeFile Open StrFN For Output As #IntFlNo For i = 1 To LngLoop Print #IntFlNo, Cells(i, "A") Next i Close #IntFlNo End Sub

  • マクロ 入力する文字に色を付けたい

    Sub CountUp(ByVal mCol1 As String, mCol2 As String) Dim LastRow1 As Long Dim LastRow2 As Long Dim mRow As Long With Sheets("プレーヤー") LastRow1 = .Cells(Rows.Count, mCol1).End(xlUp).Row LastRow2 = .Cells(Rows.Count, mCol2).End(xlUp).Row If LastRow1 > LastRow2 Then mRow = LastRow1 Else mRow = LastRow2 End If If LastRow1 = 1 Then LastRow1 = 2 End If .Cells(mRow + 1, mCol1).Value = .Cells(LastRow1, mCol1) + 1 End With End Sub このコードに文字の色の指定をしたいです Selection.Font.ColorIndex = 3を入れたら赤色文字で入力できるかなと思ったのですがうまくいきませんでした(エラーにはならないのですが、色が付かなかったです)

  • msgboxの表示

    A列の値とC列の値をMsgboxに表示するにはどうしたらいいのでしょうか?C列で一番高い商品とその品名A列を表示させたいのですが・・ Sub hinmei() Dim i As Long For i = 2 To Range("C65535").End(xlUp).Row Dim x As Long Dim a As Long x = Cells(i + 1, 5) If Cells(i, 5).Value < x Then a = x End If Next MsgBox a End Sub

専門家に質問してみよう