• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:先にセル書式が必要なのはなぜ ?)

セル書式の必要性とは?

このQ&Aのポイント
  • 質問者は、時間相当(mm:ss 又は hh:mm:ss)をフォーマット変更して別シートに書き出そうとしています。
  • しかし、D列の書式を事前に文字列にしないと正しいフォーマットにならないという問題が発生しています。
  • 質問者は、なぜD列の書式設定が必要なのか疑問に思っています。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1625/2467)
回答No.2

> D列の見た目は、変更しても変更しないでも > 同じで文字列として書き込まれているので区別が付きません。 変更せずに標準のままだと、ユーザー定義に変更されると思います。00:00でしたらh:mm:ssとかで右寄せ。数値としては「0」です。 なので mj = mj & wst.Cells(i, "D") & ".000" で CHAPTER01=0.000 となるのだと思います。 > 又、事前のD列の書式設定以外に対策はありますか ? 手動での説明ですが、事前に書式設定しておくという方法ですね。 数値の表示形式を設定する https://support.microsoft.com/ja-jp/office/%E6%95%B0%E5%80%A4%E3%81%AE%E8%A1%A8%E7%A4%BA%E5%BD%A2%E5%BC%8F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B-f27f865b-2dc5-4970-b289-5286be8b994a 表示形式の設定 http://officetanaka.net/excel/vba/cell/cell08.htm こちらでは、VBAの説明で「先に表示形式を設定しなければなりません」とありますので、方法はないのかもしれません。 数値関連を文字列として入力したい場合は、先に文字列設定しておくと思っていたらいいのではないでしょうか。

NuboChan
質問者

お礼

ありがとうございます。 書式設定以外に対策は無くて、 数値関連を文字列として入力したい場合は、  先に表示形式を事前に文字列設定にすると言うことですね。 記事参考になりました。 データを入力してから表示形式を設定しても、逆に表示形式を設定してからデータを入力しても同じです。 ただし、「0123」のようなデータを文字列として入力したいようなケースでは、先に表示形式を設定しなければなりません。 入力すると自動的に表示形式が設定される日付データでも、 あらかじめ表示形式が設定されているセルの場合はExcelが自動的に設定することはありません。 先に設定している表示形式が有効になります。 セルにテキスト形式を適用すると、 この数値の 自動書式設定を防ぐことが可能です。

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

その他の回答 (1)

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

エクセルの自動書式設定のせいじゃないでしょうか。 書式設定していないセル(標準とか)はエクセルの思惑で表示するみたいな。

NuboChan
質問者

お礼

kkkkkmさん、お世話になります。 以下をコメントに変えて wst.Range("D:D").NumberFormatLocal = "@" 以後を実行しても D列の見た目は、変更しても変更しないでも 同じで文字列として書き込まれているので区別が付きません。 なのに別シートにD列を利用して書き出された結果が以下のように異なります。 CHAPTER01=0.000 CCHAPTER01=0:00:00.000  どんな時にこんな分かるにくい状態が発生するかの 目安のような考え方は有るのですか? (目安がわかれば、今回のような試行錯誤する時間が短縮されるような思えます。) 又、事前のD列の書式設定以外に対策はありますか ?

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

関連するQ&A

  • (VBA)Splitの抜き出しが上手くいかない

    以下のようなコードで「指定区切り文字」の前後で文字列を切り出しています。 添付画像見てもらえれば判ると思いますが B8セルからのB列の値が「29:08」が正解なのに 「29:08:00」と最後に「:00」が付いた形式になっています。 (B13で1時間を過ぎると正常になっています。) このため、以後のE及びF列の書き出しもおかしな値となりました。 どのように修正すれば良いでしょうか ? Option Explicit Sub Chapter_Plus() Dim I As Long Dim J As Long Dim TEMP As Variant Dim SepChr As String Dim WS1 As Worksheet Dim WS2 As Worksheet Dim EndLow As Long Dim LineData As String Dim OutText As String Dim byteData() As Byte '一時格納用 Set WS1 = Worksheets("DATA") Set WS2 = Worksheets("Chapter") 'シートの初期化 WS1.Range("B3:H100").Clear WS2.Range("A1:A100").Clear SepChr = InputBox("指定文字を入力してください。", "区切り文字入力", " ") 'TotalLength = InputBox("時間を(h:mm:ss)で入力してください。", "ファイルサイズ入力") EndLow = WS1.Cells(Rows.Count, "A").End(xlUp).Row With WS1 '区切り文字で切り出す For I = 3 To EndLow TEMP = Split(.Cells(I, "A"), SepChr) .Cells(I, "B") = TEMP(0) .Cells(I, "C") = TEMP(1) Next '仮チャプター書き出す For I = 3 To EndLow .Cells(I, "E").Value = Format(.Cells(I, "B").Value, "hh:mm:ss") .Cells(I, "F").Value = Format(.Cells(I + 1, "B").Value, "hh:mm:ss") .Cells(I, "G").Value = .Cells(I, "C").Value Next '番号 For I = 3 To EndLow .Cells(I, "H").Value = CStr(Format(I - 2, "'00")) Next End With End SUB

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。

  • 【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でコピペした値がコピペ先の書式で表示できない

    こんにちは、お世話になっています。 表題のとおり、VBA内でコピペした値が、コピペ先の書式で表示ができなくて困っています。 状況としては、「指定したシート1上の範囲内のセルの文字列をコピーし、シート2で指定したセル内にペーストする」ということを行いたいのですが、貼り付けた値はコピペ元の書式で表示されてしまい、一度各セルをアクティブにしないとシート2の書式が適用されません。 どうすればアクティブにしなくても正常表示できるか、お知恵を貸してください。 なお、作成にあたり以下の条件があります。 (1)運用時に全シートはパスワード保護されるため、値に対しての入力や修正、及びショートカットやボタンによる動作は不可 (2)コピー元の書式は「文字列」固定、コピー先の書式は「ユーザー定義」固定で、さらに各行ごとに定義が異なる (3)当マクロはファイル呼出時に自動的に実行される 以下、ソースコードになります(Excel2003 SP3、VB6.5で作成) Dim first_Row As Integer 'シート1のデータ先頭行 Dim first_Col As Integer 'シート1のデータ先頭列 Dim last_Row As Integer 'シート1のデータ最終行 Dim last_Col As Integer 'シート1のデータ最終列 Dim first_KeyNo As Integer 'シート2のキー番号先頭行 Dim last_KeyNo As Integer 'シート2のキー番号最終行(今回省略) (中略、↑のデータを各ワークシートからセット) Dim i As Integer 'シート1のカウント用変数 Dim k As Integer 'シート2のカウント用変数 i = first_Row k = first_KeyNo 'データ最終行になるまで処理を繰り返す Do While(i >= first_Row and i < last_Row)      'シート1と2のキーNoがイコールならセット      If Worksheets("シート1").Cells(k, 1).Value = Worksheets("シート2").Cells(i, 2).value Then           Worksheets("シート1").Range(Cells(i, first_Col),Cells(i, last_Col).Copy           Worksheets("シート2").Range(Cells(k, 1),Cells(k, 20).PasteSpecial paste:=xlValues           Application.CutCopyMode = False      'イコールでないなら、イコールになるまでシート2のキー番号を検索      ElseIf Then           (中略)      EndIf      i = i + 1      k = k + 1 Loop VBAは今回初めて作成するので、見づらいかと思いますがよろしくお願いいたします。

  • 【vba】「CStr」と「Str」は同じ意味ですか?

    Sub 数値を文字型に変更() Dim i As Long Dim moji As String i = 1 moji = CStr(i) moji = Str(i) End Sub 上記のコードで得られる結果は同じです。 "1"になります。 「CStr」でも「Str」でも数値を文字列に変換しています。 ということは「CStr」でも「Str」は同じなのですか? しかしコードの表示色が 「CStr」→キーワード 「Str」→識別子 です。 これが違うと言うことは何かが違うのでしょうか?  よろしくお願いします。

  • セルの値から任意の文字のみを抽出する

    こんにちは。 VBA勉強中です。 どうしても詰まってしまったので力を貸してください。・゜・(ノД`)・゜・。 Sheet1にはA列~J列にデータが入っています(行数は3行目~□行目・・・都度変わります) Sheet2には抽出したい文字の一覧(仮に禁止ワードとします)がB列5行目~○行目まで入ってます。 質問としてはSheet1のB列、D列、F列のそれぞれの値より禁止ワードを抽出する。 1つのセルに禁止ワードが0~最大5つ入っている時にK列から→方向に禁止ワードを並べて行くといった 感じです。 わかりにくくてすみませんが宜しくお願い致します。 以下自分で考えてみたコードです。。 これだと始めのB列のみ抽出に成功しましたがその他の列からは抽出できず・・・。゜(PД`q。)゜。 列Bで使用したコードをD列、F列にも使えると下に数値のみ変えて羅列しただけだからでしょうか;w; 本当に初心者ですみません。。 以下コードです。 Sub 禁止ワード抽出() Dim SR As Integer , LR As Integer, SR2 As Integer , LR2 As Integer , LR3 As Integer , LR4 As Integer Dim i As Long , j As Long , k As Long , m As Long Dim KINSHI As Variant SR = 3 SR2 =5 LR = Sheets("Sheet1").Range("B" Rows.Count).End(xlUp).Row LR2 = Sheets("Sheet1").Range("D" Rows.Count).End(xlUp).Row LR3 = Sheets("Sheet1").Range("F" Rows.Count).End(xlUp).Row LR4 = Sheets("Sheet2").Range("B" Rows.Count).End(xlUp).Row For j = SR2 To LR4 KINSHI = Sheets("Sheet2").Cells(j , 2).Value For i = SR To LR If Sheets(Sheet1).Cells(i , 2).Value Like ("*" & KINSHI & "*") Then If Cells(i , 10) = "" Then Cells(i , 10) = KINSHI Else   If Cells(i , 10 + 1) = "" Then Cells(i , 10 + 1) = KINSHI            Else   If Cells(i , 10 + 2) = "" Then Cells(i , 10 + 2) = KINSHI Else   If Cells(i , 10 + 3) = "" Then Cells(i , 10 + 3) = KINSHI Else   If Cells(i , 10 + 4) = "" Then Cells(i , 10 + 4) = KINSHI End If End If End If End If End If End If Next i , j 以下上記コードをD列、F列バージョンで並べています・・・・ End Sub 恐らくOffsetプロパティを使う方がいいと思いましたが中々うまくいかず 自分なりに色々考えてみてこんな残念な結果になってしまいましたが 皆様のお力添えどうぞ宜しくお願い致します。

  • 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 ですと、『型が一致しません』と出てデバックになってしまいます。 文字の数値を合わせるにはどの様にすればいいでしょうか? ご教示お願い致します。

  • 【Excel VBA 2010】空白セルの検索

    ある範囲の中から書式設定も文字も入っていないセルを選んできて、 それらには何も入力がされていないという警告を出そうと考えています。 Dim k As Integer Dim msg As String Dim 空欄() As Variant k = 0 msg = " " For i = 1 To 10 For j = 1 To 10 If Cells(i , j) = Cells(i , j).SpecialCells(xlCellTypeBlanks) Then ReDim Preserve 空欄(k) As Variant 空欄(k) = Cells(i , j).Address k = k + 1 End If Next Next If 空欄(k) <> " " Then For i = 0 To k - 1 msg = 空欄(i) & vbCrLf Next MsgBox (msg & "が入力されていません。") Else ・ ・ ・ と続くのですが、上記のコードでエラー(型が一致しない)が起きます。 素人のため原因がわからないので、どなたか修正をお願いいたします。

  • 空白セルをとばして転記

       A   B   C   D   E 1 リンゴ        リンゴ   2              ミカン   3 ミカン        バナナ  4 5 6 バナナ 7 上記のように、空白のセルをとばして(詰めて)転記するにはどうすれば良いでしょうか? Dim n as long Dim k as long k = Range("A" & Rows.Count).End(xlUp).Row For n = 1 To k If Cells(n, 1) <> "" Then Cells(n, 4) = Cells(n, 1) n = n + 1 End If Next n とやると当然ながらD1のセルのみにしか転記できません A列の範囲を取得し、PasteSpecialのSkipBlanksで貼り付けてもうまくいきませんでした どうぞよろしくお願いします

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

専門家に質問してみよう