質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

6回答

25609閲覧

【Excel VBA】一致検索、検索後の値が一致していたら値の変換転記したい

carrin

総合スコア15

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/03/11 05:58

編集2019/03/14 08:38

以前似た内容を質問させていただいたのですが、
それに少し似た内容の不明点が出てきましたので、再度質問させていただきました。

やりたいこと①

"値一致シート"のC列の値と"値の元"シートのA列の値が一致したら、
"値一致シート"のC列の値をA列に転記する。
この際転記する値は年(2019など)に変換して表示させたい。

"値一致シート"イメージ説明
"値の元"シートイメージ説明
"値一致シート"のC列には、"19.01.05"などの値があります。これは"2019/01/05"という
年月日のことを指しています。
"値の元"シートのA列の"年間カレンダー"の列も"2019/01/05"という
年月日の値が入っています。
この値をキーに、"値一致シート"のC列の値が"値の元"シートのA列と一致していたら、
"値一致シート"のA列に"19.01.05"の頭の"19"に"20"をつけて"2019"という4桁の
年を表示させたいです。

やりたいこと②

"値一致シート"のC列の値が"値の元"シートのA列と一致していたら、
"値の元"シートのC列の"WK表示"の値を、"値一致シート"のB列に転記させたいです。
例えば、"19.01.05"なら"WK 01"、"2019/1/22"なら"WK 04"。

下記の画像のように仕上げるのを目標として
色々試行錯誤しているところです。

[完成させたいイメージ図]イメージ説明

Dim S2 As Worksheet Dim ws As Worksheet Dim R As Long Set S2 = Worksheets("値一致シート") '転記先 Set ws = Worksheets("値の元") 'Calendar For R = 1 To ws.Cells(Rows.Count, "A").End(xlUp).Row If S2.Cells(R, "C").Value = ws.Cells(Rows.Count, "A")Then S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") End If Next R End Sub

Find関数などを使用し、何度も検索⇒一致したら転記を試したのですが、
やはりうまく値の検索も抽出も転記もできなかったので、
まずセルとセルの内容が一致しているか⇒一致しているなら、その値を
セルに転記させる・・・
という方法をとってみました。
しかし、上記のソースコードだとエラーは出ないのですが、
何一つ値をとってこれません。

値を抽出できないので、やりたいこと②のロジックも
わかりません。。。

2019/03/13 修正したソースを追記(まだ未完成ですが、途中経過です)

Sub 編集中() Dim S2 As Worksheet Dim ws As Worksheet Dim R As Long 'Selection.Value = Selection.Value '(この式は値に変換するという意味らしい) Set S2 = Worksheets("値一致") Set ws = Worksheets("値の元") Dim iRowI As Integer '"値の元"(読み取り)行 Dim iLastRow As Integer 'A列の最終データ行を取得する(年間カレンダーの最終行) iLastRow = ws.Range("A2").SpecialCells(xlLastCell).Row '表示形式を年だけで表示させる 'Calendar加工"の2行目~最終データ行までループ処理させる For iRowI = 2 To iLastRow '"Weeklyシート加工"の"F列"の最後の行になるまで実行させる For R = 2 To S2.Cells(Rows.Count, "F").End(xlUp).Row 'If S2.Cells(R, "C").Value = ws.Cells(Rows.Count, "A") Then '「値一致」シートのC列の値を、「値の元」シートのA列と比較して、一致しているか調べてみる If S2.Cells(R, "F").Text = ws.Cells(iRowI, "A").Text Then 'S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") '「値一致」シートと「値の元」シートで一致していたら、その行の値を転記する S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value End If If S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value Then ' S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) CStr 関数は、指定した値を文字列型 (String) に変換する ' S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value ' S2.Cells(R, "A").Value = Format("2019/01/05", "yyyy") ' S2.Cells(R, "A").Value = Format(ws.Cells(S2.Cells(R, "A").Value, "yyyy")) End If '"WK"列の値を表示させる If S2.Cells(R, "F").Text = ws.Cells(iRowI, "A").Text Then S2.Cells(R, "B").Value = ws.Cells(iRowI, "C").Value End If Next R Next End Sub

2019/03/14 上手くいかないので引き続き検証中(備忘録も兼ねてソースを残します)

検証①

'「値一致」シートの値を、「値の元」シートのA列と比較して一致していたら If S2.Cells(R, "F").Text = ws.Cells(iRowI, "A").Text Then 'S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") 'その行の値を転記する S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value 'CStr 関数は、指定した値を文字列型 (String) に変換する S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) ' S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy") S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") '検証① ' Range("A2:A30").Value = Format("2019/01/01", "yyyy") '検証② End If

(コメント多く読みにくくてすみません)
この状態で実行すると、以下の画像のように抽出される。
参照先の設定を誤っているのか、A1のセルだけ表示がおかしいです。
元に戻しても、このA2の表示が修正されない。
引き続きこちらも修正・検証中。

イメージ説明

検証②

'「値一致」シートの値を、「値の元」シートのA列と比較して一致していたら If S2.Cells(R, "F").Text = ws.Cells(iRowI, "A").Text Then 'S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") 'その行の値を転記する S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value 'CStr 関数は、指定した値を文字列型 (String) に変換する S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) ' S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy") ' S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") '検証① Range("A2:A30").Value = Format("2019/01/01", "yyyy") '検証② End If

イメージ説明

この状態で実行すると、以下の画像のように抽出される。

検証③ 書式を文字列で設定しても「日付」で抽出されてしまう

'CStr 関数は、指定した値を文字列型 (String) に変換する S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) '「値一致」シートの値を、「値の元」シートのA列と比較して一致していたら If S2.Cells(R, "F").Text = ws.Cells(iRowI, "A").Text Then 'S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") 'その行の値を転記する S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value ' S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy") ' S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") '検証① ' Range("A2:A100").Value = Format("2019/01/01", "yyyy") '検証② End If

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2019/03/11 06:14

**やりたいこと①** こちらに関しましては、単純に比較とString型の足し算で出来ますので、頑張って下さい。 仕事なので答えを教える事は絶対に出来ません。 **やりたいこと②** こちらに関しましては、なんか文章の最初と最後がかみ合っていないのでもう一度しっかりと考えてきて下さい。
carrin

2019/03/11 06:22

**やりたいこと①** ⇒ 比較とString型の足し算、調べて試してみます。ご教示ありがとうござます。 **やりたいこと②**⇒ 自分で記述した内容を整理しなおし致します。ご指摘誠にありがとうございます。
stdio

2019/03/11 07:46

Rows.Countはたしか値が固定だったハズだからFor文で回しても一切変化ないよ。 あとRows.Countとはシートに書ける限界数だったはずッス。
carrin

2019/03/12 07:08

>Rows.Countはたしか値が固定だったハズだからFor文で回しても一切変化ないよ。 そうなのですね!だからエラーも表示されないのですね。 ご教示ありがとうございます。
guest

回答6

0

VBA

1For R = 1 To ws.Cells(Rows.Count, "A").End(xlUp).Row ←ここの値を調べてみて、多分回しすぎ。 2 If S2.Cells(R, "C").Value = ws.Cells(Rows.Count, "A")Then ←ここはStrCopmを使うとより正確に判定できます。 3 S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") ← "A")の後に.Valueを付けましょう。 4 End If 5 Next R

指摘したいところはこんなところでしょうかね...

例えば、"19.01.05"なら"WK 01"、"2019/1/22"なら"WK 04"。

これに関しては下の05を一度Long型にして7でから割ったら良いと思います。1~5ぐらいまでは取得できるので、後はWK + Format関数で何とかなりそうです。

投稿2019/03/11 07:56

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carrin

2019/03/12 06:44

こんにちは^^ >下の05を一度Long型にして7でから割ったら良い こちらに関しまして、今後の自分にとっても勉強になります!こういう考え方があるのですね! 朝から操作してみましたが、頭が混乱してしまい今の自分の能力では 難しいです(泣)なかなか教えてもらえないことです。ご教示ありがとうございます! 何度も書き直したりを繰り返して、ほんの少し前進したので、 自己解決欄(まだ解決できていませんが・・)に値を転記できたソースを 記述してみました。この度はご回答くださり、誠にありがとうございます!
stdio

2019/03/12 07:18

焦らずにゆっくりとやっていくといいでしょう(仕事ならそうも言ってられませんが) 型を理解しないと出来ない事も多い為、型は理解しておいた方が良いと思います。型変更なら下記を参考にすると良いでしょう。 あと四則演算理解してないと苦しいよ。少3レベルの問題も解決できない出来ないなんて人間なんて社会人としてもゴミなので... http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_08.html
jawa

2019/03/12 07:24

横から失礼しますm(__)m WK01の01とは、前の質問(https://teratail.com/questions/177790)で対応した「その年の何週目」という数値だと思います。 年度によって変わりますので、単純に7で割る計算だけでは求められません。 2019年度に合わせた割り算で計算では、2020年度では使えなくなってしまいますのでご注意ください。 …この週数に関する説明などは今回の質問だけではわかりませんので、前回の質問を引き継ぐ内容であれば本文にリンクを貼っておくことをオススメします。
stdio

2019/03/12 07:30

そっちですか...WK 04って書いていたから月単位だと思ったわ。 それなら確かに閏年とかの問題も出てきますね^^ いや...DateDiff関数使えばいいだけじゃな。
carrin

2019/03/12 07:43

"WK"の表示におきまして、アドバイス誠にありがとうございます。 過去の質問、そうですよね!色々手を付けていたので読み返していなかったです。大変失礼いたしました。皆様のご教示に感謝申し上げます。
carrin

2019/03/12 07:57

jawaさん >…この週数に関する説明などは今回の質問だけではわかりませんので、前回の質問を引き継ぐ内容であれば本文にリンクを貼っておくことをオススメします。 そうですよね、私の質問が飛び散ってしまっていて読みにくいですよね。。 質問しているにも関わらず、お手数をおかけしてしまい誠に申し訳ございませんでした。質問内容を引き継いでおりますので、整理して再度投稿したいと思います。
stdio

2019/03/12 08:04

ここはQiitaではないので、質問が終わったのなら纏めなくても構いませんよ。 書き方には気を付けて...また新しい質問ができたら再度一から質問することです。
carrin

2019/03/12 08:37

stdioさん ありがとうござます!きっとまた質問することになるかと思いますが、その前に自分でしっかり調べて、勉強しますね!
stdio

2019/03/14 07:59

分からなければ質問して下さい。 ひとまず、疑似的なソースコードなら教えますので...
carrin

2019/03/14 08:49

stdioさん、こんにちは。 ありがとうございます。頭がよくないので苦戦しまくっています。 本文に検証した結果を適宜残すようにしています。 回答者様からせっかくアドバイスをいただいているのに、全然進捗がなくて 申し訳ない気持ちでいっぱいです(´;ω;`)ウゥゥ セルの書式を文字列で値抽出するようにしても、反映されず、 日付形式のままになってしまうので、"yyyy"と表示させることができない。 そもそも参照先の元データを見直すべきなのか、検討しています。 この元データを修正するのにも、ものすごい時間がかかってしまったので、上手くいかなくなるのが不安です。 値一致シートのA2から、一回実行するだけで”2019”と出せるようになるまで、関数の意味など自分で見直すところです(なかなか呑み込めなくて・・)
guest

0

自己解決

まだまだ完成ではないのですが、
転記ができたソースを貼ります。

Sub

1 Dim S2 As Worksheet 2 Dim ws As Worksheet 3 Dim R As Long 4 5 'シートを変数に格納 6 Set S2 = Worksheets("値一致") 7 Set ws = Worksheets("値の元") 8 9 Dim iRowI As Integer '"値の元"(読み取り)行 10 Dim iLastRow As Integer 11 'A列の最終データ行を取得する 12 iLastRow = ws.Range("A2").SpecialCells(xlLastCell).Row 13 14 15 'Calendar加工"の2行目~最終データ行までループ処理 16 For iRowI = 2 To iLastRow 17 18 '「値の元」シートのすべてのデータをループ処理 ⇒本当は「値一致」シートの全行を埋めたい? 19 'For R = 1 To ws.Cells(Rows.Count, "A").End(xlUp).Row 20 '「値一致」シートのC列に値が入っている分だけループ処理をしたい 21 For R = 2 To S2.Cells(Rows.Count, "C").End(xlUp).Row 22 23 '「値一致」シートのC列の値を、「値の元」シートのA列最終行と比較 24 '⇒比較対象がそれぞれおかしいですよね?本当は「値の元」シートの全行から検索をしたいはず? 25 26 '「値一致」シートのC列R行の値を、「値の元」シートのA列と比較して、一致しているか調べたい 27 If S2.Cells(R, "C").Text = ws.Cells(iRowI, "A").Text Then 28 29 '一致する場合(見つかった場合)の処理【日付の転記】:「値一致」シートのA列に「値の元」シートのA列の値を転記(したい) 30 '⇒最終行ではなく、「値一致」シートと「値の元」シートのセルの値が一致した場合、「値の元」シートの値をコピーする 31 S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value 32 33 '【"2019"の表示】上記で取得した日付値("yyyy/mm/dd")をセルに"2019"と表示させたい 34 '⇒これができない 35 36 37 '【週数(WK)の転記】:「値一致」シートのB列に「値の元」シートのC列の値を転記させたい 38 '⇒これができない 39 40 End If 41 Next R 42Next 43 44End Sub 45

投稿2019/03/12 06:46

編集2019/03/12 06:48
carrin

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2019/03/12 09:07

全体として ・カレンダーを全件ループ(おそらく365周程度)  ・値一致シートを前行ループし、日付の一致する行に値を埋めていく(1行も一致しない日付もある) という流れですね。 私のイメージでは ・値一致シートを全件ループ  ・各行の日付に対し、カレンダーを上からループしてから一致する日付を検索。  ・1行見つけて転記したら、カレンダーのループ中断して次へ。 という流れを想像していました。 ループのまわし方については、値一致シートのデータ量によってもループ回数はかわりますので一概にどちらがいいとは言えません。 効率の良い方法を検討してください。 その他で気になった点は、 ``` '⇒最終行ではなく、「値一致」シートと「値の元」シートのセルの値が一致した場合、「値の元」シートの値をコピーする S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value ``` の処理です。 この日付として値を転記する処理は、本当は不要な処理ですよね? 実際にはその下で「やりたいこと」として記述されていることが本来の処理だと思います。 でも、値を転記する処理はかけていますよね? であれば、それと同じように週数も転記すればいいと思います。 年4桁についてはFormat関数で変換した値を転記すればいいと思います。詳しくは私の回答のコメント欄で。
carrin

2019/03/13 07:38

jawaさん いつも丁寧なご回答、誠にありがとうございます。 >私のイメージでは ・値一致シートを全件ループ  ・各行の日付に対し、カレンダーを上からループしてから一致する日付を検索。  ・1行見つけて転記したら、カレンダーのループ中断して次へ。 という流れを想像していました。 ⇒yes。このようにしたかったのです!私が今自分で書けるソースが、 カレンダー(「値の元」シート) を全件ループさせ、一致する日にちを見つけたら転記を繰り返す・・ という処理になってしまいました。 本来ならjawaさんのおっしゃる通りのソースが書けたら一番簡潔でわかりやすいです。 このシートは365周までしかループさせる必要はない(件数は増えない)ので、 今回は自分が理解できるソースが書け、実行できることをまずは 優先させたいので、こちらはこのまま使用していこうかと考えています。 今後余裕が出来たら、もちろん効率の良いソースに改修します! >日付型の値をそのまま出力すれば当然そのまま日付としてセルに出力され、 あとはセルの書式設定(国内なら大抵"yyyy/mm/dd"形式)に従って表示されるはずです。 これを出力時に"19.01.05"のような"yy.mm.dd"形式の文字列にして出力したい場合、 Format関数を利用します。 例:Cells(1,"A") = Format("2019/01/05", "yy.mm.dd") ⇒こちらに関しまして、出力時は"19.01.05"のような"yy.mm.dd"形式の文字列に出来なかったので、 セルの表示形式を先に"yy.mm.dd"形式になるように書式設定しておき、 そこに値を出力する形にしました。(そのようにしか私の知識では出来ませんでした) S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) で、値を文字列に変換してみたのですが、文字列には変換されず、 日付は"2019/01/05"の形式から変化せず。 Selection.Value = Selection.Value 選択されているセルの値をその値にできる式のようで、 こちらも試してみましたが、文字列に変換されませんでした。 「値 文字列へ変換」でググって調べて得た式です。 >【"2019"の表示】は、前述のFormat関数でなんとかなりそうでしょうか? ⇒faildしました(泣)S2.Cells(R, "A").Value = Format("2019/01/05", "yyyy")の式にすると、表示される結果が"1905/7/11 "になってします。 値を文字列に変換しようと、 S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) 'CStr 関数は、指定した値を文字列型 (String) に変換する の一文をセットしましたが、文字列に変換されていないのか、 "yyyy"を文字列として認識してくれず、表示される結果が"1905/7/11 "です。これは"今"の日付から年を表す数値を取り出して、それを日付シリアル値と見なされてしまい、該当する日付の年月日を返されたのだと解釈しています・・そもそも間違っているかも知れませんが、自分で最初に抽出した年月日の値が文字列にならないので、文字列に変換できなければ、@"yyyy"と抽出条件をセットしても "2019"という文字列で抽出することは出来ないですよね。 >【週数(WK)の転記】については、カレンダーの一致する行から転記するだけだと思います。⇒現在の実装でA列に日付を転記しているのと同様。 こちらはアドバイスのおかげで、値をセットすることができました!ありがとうござます! >作成したコードは本文に追記した方が、後からこの記事を頼りにする方のためにもいいと思いますよ。 ⇒はい、これからは本文に記述するようにいたします!ありがとうござます^^
jawa

2019/03/13 08:38 編集

>S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value)で、日付は"2019/01/05"の形式から変化せず。 現在、S2のA列のセル値(.Value)には、日付型の値がセットされているのではないでしょうか? おそらくVBA上では、その日付の値を正しく文字列に変換できていると思います。 しかしそれを受け取るセルの方が、おそらく日付型のセルになっているため、文字列"2019/01/05"を出力しても日付型として解釈しなおしているのだと思います。 つまり ・日付型の"2019/01/05"(シリアル値:49470)をセルから取得 ・CStrで文字列"2019/01/05"に変換 ・セルに文字列"2019/01/05"を出力 ・セルの書式設定により文字列"2019/01/05"が日付として解釈され、日付型の"2019/01/05"(シリアル値:49470)として扱われる ということになっているのだと思います。 >⇒faildしました(泣)S2.Cells(R, "A").Value = Format("2019/01/05", "yyyy")の式にすると、表示される結果が"1905/7/11 "になってします。 これは惜しいとこまでできていますね。 これもVBA上では正しく"2019"の文字列に変換できています。 しかし前述のとおり受け取るセルの方が日付型セルとなっているため、 "1905/7/11 "(シリアル値:2019)という日付で表示されています。 セルの型を標準や文字列、数値などにすれば2019と表示されると思いますよ。
carrin

2019/03/14 03:00

jawaさん、こんにちは! ご回答、誠にありがとうございます! >しかしそれを受け取るセルの方が、おそらく日付型のセルになっているため、 文字列"2019/01/05"を出力しても日付型として解釈しなおしているのだと思います。 ⇒受け取るセルを日付型ではなく、文字列として書式がセットされるように、 以下の一文を追加してみました。 Selection.Value = Selection.Value '(この式は値に変換するという意味らしい) これだと、値になったのか動きが分かりませんでした。 それで昨日も記述した以下もそのまま残してみました。 S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) これで、A列("2019/01/05"の"2019"を表示させたい列)の書式設定が "文字列"でセットされたので、 以下のソースを記述。 S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy") しかし、これだと"2019"と値表示にならず、そのまま"yyyy/mm/dd"の形式でした。 手順や考えが誤っていると思いますが、いろいろ試してみて、 以下のソースで何とか"2019"と表示されるようになりました。 If Selection.NumberFormatLocal = "G/標準" Then '日付以外で設定してみる Selection.NumberFormatLocal = "yyyy" '"2019"と年表示させる Selection.Copy Range("A2:A365").Select 'A2から少し多めに書式をセット End If しかし、これだと数式バーが"yyyy/mm/dd"なのです(泣) これを直せるようにならないと、文字列としてDBに取り込む際に エラーになると思うので、今なぜ文字列でセットしているのに 文字列でセルに一回で"2019"と転記できないのかさらに検証しています。 jawaさんのご教示、全てとても参考になっています!
jawa

2019/03/14 03:54 編集

すみません。 `Selection.Value = Selection.Value` についての解説を忘れていました。 これは「(この式は値に変換するという意味らしい)」ではなく「(式を値に変換する)」という処理で、結論から言うと今回これは無意味です。 例えばセルに"=1+1"という式を入力すると、表示は"2"となりますよね? でもセルは"1+1"という式を忘れてしまったわけではなく、`.Formula`というプロパティに数式を覚えています。 そして値(.Value)には"2"という数字を持っています。 この状態で、 `Selection.Value = Selection.Value` を行うと、「選択されているセルの値」に「選択されているセルの値」がセットされます。 一見何もかわらなそうですが、`Selection.Value = 2`としているのと同じなので、式のことはきれいに忘れて"2"という値だけが格納されるわけです。 つまり対象セルは"=1+1"ではなく"2"となります。 これが `Selection.Value = Selection.Value` の行っていることです。 今回はセルにワークシートの数式を出力している訳ではないので、これは意味をなしません。 あと、Selectionを対象とした記述になっていますので、事前に値に変換したいセルを選択しておく必要があります。 以上が「何も変わらない」理由というわけです。
jawa

2019/03/14 04:03

本題の方ですが、ちょっと状況が掴みにくくなってきました。 一度整理して、以下のことだけを行ってみてください。 ①出力セル("2019"を表示したいセル)の値をクリアし、書式を[標準]もしくは[文字列]にする。 (これはVBA内ではなくワークシート上の操作で行います。) ②VBAで`S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy")`を実行。 (Rには出力する行番号を直接書いてしまってもいいです) これで"2019"と出力されないでしょうか? 問題点を整理するため、とりあえず書式の加工(NumberFormatLocal)などは行わず、上記の値セットだけを行ってみてください。 これだけでできると思うのですが。。
carrin

2019/03/14 04:52

jawaさん、ご回答誠にありがとうございます! ①ワークシート上でクリア実行。 ②S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy") を実行すると、セル(数式バーも)に"1905/7/11"と表示されました。 >(Rには出力する行番号を直接書いてしまってもいいです) 今回A2から順にA3,A4...と表示させる必要があるため、 S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") と記述し、実行すると、今度は""セル(数式バーも)に"2019/1/5"と表示されました。 >問題点を整理するため、とりあえず書式の加工(NumberFormatLocal)などは行わず、上記の値セットだけを行ってみてください。 ⇒先ほど記述したこちらの箇所はコメントアウトし、実行しました。 色々見直しているのですが、直りません。。。難しいです(泣)
jawa

2019/03/14 06:38 編集

>①ワークシート上でクリア実行。 これも大事ですが、セルの書式のほうがさらに大事です。 ②を実行する前にセルの書式は「標準」または「文字列」に変更されましたか? >S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") >今度は""セル(数式バーも)に"2019/1/5"と表示されました。 固定文字列”2019/01/01”を指定しているのに、なぜ"2019/1/5"になってしまうのでしょう?? ”2019/1/5”は本当に >S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") をおこなった出力結果なのでしょうか・・? S2が意図したシートになっていないのかも? たとえば >Msgbox S2.Cells(2, 1).Value >Msgbox Format("2019/01/01", "yyyy") >S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy") >Msgbox S2.Cells(2, 1).Value として実行してみてください。 メッセージが3回表示されますが、それぞれ 1回目:処理前のA2セルの値 2回目:"2019" 3回目:処理後のA2セルの値 と表示されるでしょうか?
carrin

2019/03/14 06:54

>①ワークシート上でクリア実行。 これも大事ですが、セルの書式のほうがさらに大事です。 ②を実行する前にセルの書式は「標準」または「文字列」に変更されましたか? ⇒はい、「セルの書式設定」で「標準」に変更いたしました。 メッセージが3回表示されますが、それぞれ 1回目:処理前のA2セルの値 2回目:"2019" 3回目:処理後のA2セルの値 と表示されるでしょうか? ⇒はい、この通り表示されました。
jawa

2019/03/14 07:02

処理後のA2セルの値は”2019”だったでしょうか?
carrin

2019/03/14 07:18

>処理後のA2セルの値は”2019”だったでしょうか? 処理後は、 1回目:"1905/7/11" 2回目:"2019" 3回目:"1905/7/11" と表示されます。 本文に検証しているソースと画像を追記いたしました。。 何度もすみません!
jawa

2019/03/14 07:45

なぜ処理前に出力セル(A2)をクリアしているはずなのに >1回目:"1905/7/11" なのでしょう? A2セルが最初から日付型でシリアル値(2019)の値のセルとなっているようです。 今回の処理ではS2のシート(おそらく値一致シート)のA2セルに出力しているのですが、事前にクリアや書式設定したのは別のセルだったりしませんか? 想定では 1回目:”” 2回目:”2019” 3回目:”2019” となるはずなのです。
jawa

2019/03/14 07:53 編集

本文に追記いただいた検証ソースと画像を拝見しました。 もともとA列に日付が入っているようです。 日付が表示されているセルは書式が日付になっていますので、これを「標準」セルにして、値もクリアしてください。 ↑くどいようですがワークシートでの操作です。 もともと日付が入っていないセル(検証②のA27セル)には想定通りの2019が出力されていますよね? ですので、あとはセルの書式の問題だけだと思います。 ほぼ完成していますので、あと少しです。がんばってください。
carrin

2019/03/14 07:58

>今回の処理ではS2のシート(おそらく値一致シート)のA2セルに出力しているのですが、事前にクリアや書式設定したのは別のセルだったりしませんか? ⇒S2シート(値一致シート)のA列に、書式のクリア(と書式設定を「標準」に変更)を実施致しました。 それでも実行をすると、やはりA列全体が「日付」形式に戻ってしまいます。jawaさんがご教示くださった想定結果が出せず、申し訳ございません。引き続き検証します‼
jawa

2019/03/14 08:00

すみません、もう1点。 `S2.Cells(2, 1).Value = Format("2019/01/01", "yyyy")` を実行する前に、そのA列に日付を出力してしまう `S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value` が行われていますね。 これではせっかく事前にセルをクリアしても、ここでまた日付を出力し、セルの書式も日付型に変わってしまっています。 検証時にはできるだけ不要なコードは流さないようにしましょう。
carrin

2019/03/14 08:42

ありがとうございます! 'CStr 関数は、指定した値を文字列型 (String) に変換する S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) この一文を、 `S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value` の上に持って行ったのですが、本文の検証③のように(追記しました) やはり「日付」形式になってしまいました。 自分で書いているのに、頭が混乱してしまっています(´;ω;`)ウゥゥ 一旦きれいに整理したほうが良いですよね
carrin

2019/03/14 08:50

jawaさん、せっかく数々のアドバイスを数日に渡っていただいているのに、全然進捗が悪くて申し訳ございません(´;ω;`)
jawa

2019/03/14 11:46 編集

●セルの書式を自動解釈する動きについて● セルに"2019/01/05"という文字列を入力すると、もともとセルの書式が「標準」であっても自動的に「日付形式」に変更されます。 これはセルに格納された値をExcelが自動的に解釈し、書式設定してくれている動作です。 VBA上でCStr関数を使って日付を文字列(String型)に変換していたとしても、セルに入った時点で上記の動作が行われ、セルの書式は「日付形式」になり、値も文字列ではなく日付(シリアル値)になります。 ↑この部分を理解することが、今回の問題解決には非常に重要です。 --- ●「日付形式」のセルの動きについて● セルに日付を入力するか、書式設定で「日付」の書式を設定すると、「日付形式」のセルになります。 このセルは、書式設定で指定されたフォーマット(yyyy/mm/ddなど)に従い"2019/01/05"のように表示されます。 しかし実際の値としては、この見た目通りの文字ではなく、日付を表すシリアル値という数値で管理されています。 このため、日付が入力されているセルに対して書式を「標準」や「数値」に変更すると、セルには日付ではなくそのシリアル値(数値)が表示されるはずです。 ちなみに「日付形式」のセルに"2019/01/05"といったわかりやすい日付を入力すると、ちゃんとその日付としてセルに表示してくれます。 しかし、"2019"のようにそれだけでは日付として認識できないような値を入力をすると、Excelはがんばって解釈した結果、シリアル値が入力されたものとみなします。 "2019"を出力しているのに"1905/7/11"という日付が表示されるのが、まさにこの動きです。 さらに、"19.01.05"のように日付としても解釈できないし数値でもない値を入力すると、「日付形式」への変換をあきらめてそのまま文字列として出力します。 この場合セルの形式は「日付」のままではありますが、セルの値は日付のシリアル値ではなく、文字列が格納されています。 --- これらを踏まえて検証コードを読みなおしてみると、ループ処理の中では以下のような処理を行っていることになります。 ``` '①出力セルの値を文字列として出力しなおす S2.Cells(R, "A").Value = CStr(S2.Cells(R, "A").Value) ' ⇒出力セルに日付が入っていた場合、文字列(例えば"2019/01/05")に変換して出力しなおしているが、セルに格納される際に日付形式として解釈される '②出力セルに「値の元」シートの日付を転記する S2.Cells(R, "A").Value = ws.Cells(iRowI, "A").Value ' ⇒これは日付をそのまま入れているので、当然日付が格納される '③出力セルに年4桁"2019"を出力する ' ⇒この時点で出力セルが標準であれば2019が表示される。 ' ⇒この時点で出力セルが日付形式であれば2019がシリアル値と解釈され"1905/7/11"が表示される。 Range("A2:A100").Value = Format("2019/01/01", "yyyy") ``` 上記の流れで処理を行っていれば、事前にセルをクリアしていても処理の中でまた日付を出力(①と②)しており、2019を出力する時点では日付形式のセルになってしまっているのです。 ①と②で値が出力されないA27セルには、2019が表示されています。 検証としては、事前にセルをクリアして、書式を標準にしてから、①と②は行わず、③の処理だけが通すようにをしてみてください。 これなら2019と表示されるはずです。 うまく説明ができずまた長文になってしまいました。。すみません。
carrin

2019/03/15 01:18

jawaさん、こんにちは。 説明はとってもわかりやすいです! ●セルの書式を自動解釈する動きについて● ●「日付形式」のセルの動きについて● ⇒Excelだけで考えると(VBAを使わない状態で)、使用していて 途中で表示形式がおかしくなったとき、書式の設定だけで 修正や変更もできていたので、特に悩むこともありませんでしたので、 今回VBAでソースを書き、実行後の動きを見たときに、普段意識していなかったので、非常に悩みました!"設定しているのになぜ反映されないんだろう"の 理解が自分で解決できなかったので、これは今回習得できたとても大きな知識です! ③のみ実行すると、jawaさんのご教示のように 一度でピシッとA2セルに"2019"が、文字列として表示されました! 時間をかけてご回答をくださり、また理解に時間がかかる私に根気強くお付き合いいただき、ありがとうございました!
jawa

2019/03/15 02:53

いえいえ。 こちらこそ投げ出さずに理解できるまでがんばっていただけて、よかったです。 というわけでループの中は以下のような処理になると思います。 ``` '「値一致」シートの値を、「値の元」シートのA列と比較して一致していたら If S2.Cells(R, "F").Text = Format(ws.Cells(iRowI, "A"),"yy.mm.dd") Then 'その行の日付を年4桁にして出力する S2.Cells(R, "A").Value = Format(ws.Cells(iRowI, "A"), "yyyy") '週数も転記する S2.Cells(R, "B").Value = ws.Cells(iRowI, "C").Value End If ``` あとひといき、がんばって完成させてください。
carrin

2019/03/15 04:12

jawaさん ありがとうございます^^ 一人では決してここまで完成することは不可能でした!(まだまだ完成までかかりますが。。) 何度も投げ出しそうになりましたが、とっても親切なアドバイスのおかげで、 どんどん楽しみながら、進めていけています! もっと頑張りますね! 今回うまく表示できたソースを "解決"の欄に記載いたしました。
guest

0

セルの値の比較についてですが、"値一致シート"のC列は内部の値形式が文字列、"値の元"シートのA列は内部の値が日付形式になっているように思いますが、どうでしょうか。
その場合、値比較はうまくいきませんので、どちらかの形式に合わせる必要があります。
そうでなければ、セルのValue値での比較ではなく、セルのText値で比較します。
(S2.Cells(R, "C").Value →S2.Cells(R, "C").Text)

ところで、以下のコードは期待する内容なのでしょうか?

VB

1 If S2.Cells(R, "C").Value = ws.Cells(Rows.Count, "A")Then

"値一致シート"と"値の元"シートの比較行が適切なのであればいいのですが、対象行が「Rows.Count」というのはおかしいのではないかと思ったので。

投稿2019/03/11 07:59

編集2019/03/11 08:05
kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carrin

2019/03/12 06:43

こんにちは^^ >対象行が「Rows.Count」というのはおかしいのではないかと思ったので。 おっしゃる通りでした!ご教示ありがとうございます!ここが誤っていたためにうまくいかなかったようです。 修正して、自己解決欄(まだ解決できていませんが・・)に値を転記できたソースを 記述してみました。この度はご回答くださり、誠にありがとうございます!
guest

0

stdioさんが「答えを教えるのは絶対にNO」と強く言われていますので、概要のみアドバイスしますね。
私は自分で調べて、手を動かして、それでもわからなくて質問されているのなら、相応のアドバイスをするのがこの場だとは思っていますが。

自分で考えて、調べて、手を動かさなければ身につかないのは間違いないです。
そして他人に動くコードを与えられたとしても、理解が伴わなければ「その場で動いた」だけで終わりです。
大事なのは理解して、自分の技術にすること。その努力を怠らないこと。そういうことですよね?

あどばいす その1

まず、現状で見つからない(値が一致すると判断されていない)のは、値が違うからです。
おそらく「値一致シート」のC列には"19.01.05"という文字が入力されており、「値の元シート」には"2019/01/05"という日付を"yy.mm.dd"のような書式設定で表示だけ合わせたのではないでしょうか?

この場合「値一致シート」の値(.Value)は"19.01.05"、「値の元シート」の値(.Value)は"2019/01/05"ですので一致しません。

では、これを一致させる方向で考えてみましょう。

"19.01.05"を"2019/01/05"にしたいとき、言葉で具体的に説明するとどうなりますか?
①先頭に"20"をつける
②"."を"/"に置き変える
といった具合になると思います。

これをプログラムにすればいいのです。
ひとつひとつは簡単な処理です。

一度に加工できなければ、途中段階を変数に代入しておくというのも手です。

このように「やりたいこと」をコードに置き換えられるくらい分解した言葉にできると、どう書けばいいのかが見えやすくなります。

あどばいす その2

その1では一致させる方向でのアドバイスを書きました。
一致しない原因は値(.Value)が違うからです。
では別案として、一致するもので検索してはどうでしょう?

セルの値は異なりますが、現状で表示内容は一致していますよね?
セルの値は.Valueで取得できますが、セルに表示されている内容は.Textで取得できます。

こちらには「値の元シート」のセルにも"19.01.05"という文字が格納されているので、これで検索するという手もあります。

あどばいす その3

わからないうちは、コードにコメントを多めに書いてみるのも解決のための近道になります。
また、まだ実装できていない処理についても「ここらへんでやりたい」とだけ書いておけばソースが追いやすくなります。

例えば今回のコードにコメントを書いてみます。

Dim S2 As Worksheet Dim ws As Worksheet Dim R As Long 'シートを変数に格納 Set S2 = Worksheets("値一致シート") '転記先 Set ws = Worksheets("値の元") 'Calendar '「値の元」シートのすべてのデータをループ処理 ⇒本当は「値一致」シートの全行を埋めたい? For R = 1 To ws.Cells(Rows.Count, "A").End(xlUp).Row '「値一致」シートのC列R行の値を、「値の元」シートのA列最終行と比較 ⇒比較対象がそれぞれおかしいですよね?本当は「値の元」シートの全行から検索をしたいはず? If S2.Cells(R, "C").Value = ws.Cells(Rows.Count, "A") Then '一致する場合(見つかった場合)の処理 '【日付の転記】:「値一致」シートのA列に「値の元」シートのA列の値を転記(したい) ⇒最終行ではなく、みつけた行の値をコピーしたい S2.Cells(R, "A").Value = ws.Cells(Rows.Count, "A") '【週数の転記】:「値一致」シートのB列に「値の元」シートのC列の値を転記(したい) End If Next R

こんな感じでしょうか。

やりたいことと、実際のコードのギャップに気が付くと思います。
これを正していけば、完成に近づいていくものと思います。

たとえば現状では対象範囲のループしか回していませんが、検索するためのループも必要になりそうです。
(FINDで全行から検索するのであれば検索ループは不要かも?)

自分で書いたソースでも、翌日には意味が分からなくなることは多々あります。
後から見たときに読みとりやすいソースを書くことを心がけましょう。


以上、長くなりましたが参考になれば幸いです。

投稿2019/03/11 07:49

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2019/03/11 08:14

私が「答えを教えるのは絶対にNO」なのは「大事なのは理解して、自分の技術にすること。その努力を怠らないこと。」でもありますが、答えを教えるという事はデバックして品質を保証しなければならないという事ですので、単にめんどくさいしそこまでする義理がないだけです。
jawa

2019/03/11 08:37 編集

>答えを教えるという事はデバックして品質を保証しなければならないという事 そこまでの責任はないでしょう。(あまりに無責任なアドバイスでも困りますが。) あくまでもサンプルコードの提供であって、製品の提供ではありませんから。 そういう意味でいえばTeratailで「答え(製品)」を提供する人はいないと思います。 みんな「アドバイス(サンプルコード)」の提供までですよね。 参考までに、いい具合に利用してね、という話です。 ここでの質問⇒アドバイスの中で「バグがあったけど、どうしてくれるんだ!」みたいなことにはならないと思うのですが(^-^; まぁ保証はしませんが、提供した情報にはある程度責任を持ちたい、とも思っています。 それも当然義務ではありませんけどね。
stdio

2019/03/11 08:45

私も完全な答えを教えるつもりは毛頭ありませんよ。 「みんな「アドバイス(サンプルコード)」の提供」といっても限度超えて答えになっている様な回答もありますからね... ただ、ExcelVBAならブレイクポイント貼れるし、ちゃんとオブジャクトの中身確認できるし、デバック機能もあり、グーグルにヒントが豊富にあるからね。それをした上でそれでもどうしても分からなかったら、聞いて来いという事です。
jawa

2019/03/11 09:20 編集

ハハハ…きっと私のように過剰にアドバイスする人のことを指しているのでしょうね(^-^; 言わんとすることは理解できます。 「どこから手を付けていいのかもわからない初心者」さんと「ある程度自力でコーディングできる初心者さん」で対応の敷居も変わりますので一概には言えませんが、一応、受け取り手は選んでいるつもりですけどね(^-^; ただし間違えてはいけないのは「答えになっている様な回答」であっても「答え」を提供しているわけではありません。 当然「品質を保証しなければならない」なんて突拍子もない発想はありえません。 サンプルを利用される方は、いい具合に利用して、自分の技術として活用・吸収してください。 (・・・なんか質問と関係ないコメントを伸ばしてしまっている。。回答削除リクエスト出した方がいいかな。。)
carrin

2019/03/12 06:52

こんにちは^^ >あどばいす その1 >「値一致シート」のC列には"19.01.05"という文字が入力されており、 には"2019/01/05"という日付を"yy.mm.dd"のような書式設定で 表示だけ合わせたのではないでしょうか? ⇒こちらに関しまして、最終的に表示させたい"文字列"が"2019"などの"yyyy"表示なんです。 質問「値の元シート」しているくせに、説明がとっても不十分で誠に申し訳ございません。 本来"19.01.05"という文字列で統一して転記したかったのですが、私が書いたソースだと 日付形式(”2019/01/05)となってしまいます。これをどうやっても解消できませんでした。 「値一致シート」には、「値の元シート」の値("2019/01/05")が転記されたので、 この値の"2019"のみを表示させようと思い、Left関数を使用したところ、 なぜかセルの値が"1981/03/01"と今回せっかく取り出した値が置き換わるし、 左4桁を抽出できませんでした。 >あどばいす その2 こちらに関しまして、参照先のセルの指定も誤っていたのを修正、 .Textを使用して修正してみました。ご教示ありがとうございます! 自己解決欄(まだ解決できていませんが・・)に値を転記できたソースを 記述してみました。 あどばいす その3 おっしゃる通り、自分ではコメントをたくさん書いてきたつもりでしたが、 自分で書いておきながら、後日見直すと「あれ?これ本当にちゃんと自分で理解できてないかも!」 という箇所が多々見つかっております(泣) これからは何度も自分が修正・見直しをするので、きちんと理解しなくてはいけないので、 記述漏れがないように、しっかりコメントを残す癖をつけます^^ このような親切なアドバイスをいただけるので、何度も投げ出したくなっていましたが、 今は逆に「もっと頑張って早く覚えたい!」と思えるようになりました! いつもありがとうございます。 今取り掛かっているのが、 【"2019"の表示】と【週数(WK)の転記】です。 *まだ解決していないのに、サイトの使い方がまだよくわかっておらず、  この質問が解決済みになってしまいました(;;)どうしましょう・・・(泣)
jawa

2019/03/12 08:59

>あどばいす その1 提示いただいている画像で「値の元シート」のA列セルには"19.01.05"のように表示されています。 でもセルの値は"2019/01/05"ですよね? ですので、今の「値の元シート」のA列はセルの書式設定で表示だけ"yy.mm.dd"にされているものと推測しました。 実際に`.Text`での比較が一致するようでしたら、そうなっているのではないでしょうか。 (値は"2019/01/05"、表示は"19.01.05") >私が書いたソースだと日付形式(”2019/01/05)となってしまいます。 おそらく前回作成したコードの話だと思いますが、日付型の値をそのまま出力すれば当然そのまま日付としてセルに出力され、あとはセルの書式設定(国内なら大抵"yyyy/mm/dd"形式)に従って表示されるはずです。 これを出力時に"19.01.05"のような"yy.mm.dd"形式の文字列にして出力したい場合、Format関数を利用します。 例:Cells(1,"A") = Format("2019/01/05", "yy.mm.dd") ちなみにFormat関数は ・年4桁"yyyy"だけ出力したい場合 ・"2019/01/05"という日付を"19.01.05"という文字列と比較したい場合 といった場面でも利用できます。 ただし、日付形式の整形をしたい場合、Format関数の第一引数は日付である必要があります。 "19.01.05"という文字列からいきなり"yyyy"への返還などはできませんので、ご注意ください。 このように型についてはしっかり意識して、扱いやすいように出力したほうがいいと思います。 ※扱いやすいという点では現在のように「日付」として出力し、書式設定で"yy.mm.dd"形式で表示させるのはアリだと思います。 >Left関数を使用したところ、左4桁を抽出できませんでした。 これはおそらく日付型に対してLeft関数を使用したのではないかと思います。 私からのアドバイスで何度も「セル値が"2019/01/05"」と説明してきましたが、これはあくまで"yyyy/mm/dd"形式での表現です。 実際には、日付型のセルや変数には「日付を表すシリアル値」が格納されています。(例えば"2019/01/05"であればシリアル値は"43470") 日付型に対して単純にLEFT関数を使用した場合このシリアル値を左から切り取ってしまいますので、期待する値にならなかったのではないかと思います。 Left関数を使用する場合は文字列型にしてから扱いましょう。 >今取り掛かっているのが、【"2019"の表示】と【週数(WK)の転記】です。 【"2019"の表示】は、前述のFormat関数でなんとかなりそうでしょうか? 【週数(WK)の転記】については、カレンダーの一致する行から転記するだけだと思います。⇒現在の実装でA列に日付を転記しているのと同様。 >まだ解決していないのに、この質問が解決済みになってしまいました(;;) あまり質問したことがないのですが、おそらく他の回答で解決済みにする前に自己解決欄を利用すると、それをBAとして解決済みになってしまうのだと思います。 作成したコードは本文に追記した方が、後からこの記事を頼りにする方のためにもいいと思いますよ。 おそらく質問文とBA以外の回答にはあまり目を通さない方も多いと思いますので(^-^;
guest

0

"値一致シート"のC列の値と"値の元"シートのA列の値が一致したら、
"値一致シート"のC列の値をA列に転記する。
この際転記する値は年(2019など)に変換して表示させたい。

なにか、話しが矛盾してません?

一致したなら書き換える必要がないのでは?

やりたいことは、

値の元シートの各日付と読める文字列のデータ群の各データが、
別シートに存在するかを確認し、確認が出来たら、
そのセルの値を、エクセル君が日付と認識できる値に変換したい。
ですか?

こういうのは、「数式」の出番じゃないですか?
そもそもが「表計算」ソフトです。
1行目に数式を入れれば、あとはフィルハンドルをダブルクリックで、
数式がコピーされます。

とは言え、例を見ても一致しない例がありませんし、
10行程度であらゆる可能性の場合どうしたいかを、
提示されてはいかがでしょうか?

あと、関係ないですが、
解決したようなして無いような状態で、
解決にすると、見てくれる人が少なくなって、
より良い情報を提供される可能性が少なくなって、
質問者さんにとって損ではないでしょうか?

投稿2019/03/15 14:47

mattuwan

総合スコア2145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carrin

2019/03/15 15:41

アドバイス、ありがとうございます。 質問の内容が分かりにくいですよね。他の回答者様からも 多々アドバイスをいただきました。読んで下さったのに本当に申し訳ございません。 >解決したようなして無いような状態で。。 こちらに関しましても、このサイトを使い始めたばかりなので 誤った使い方を立たしてしまっています。修正できる箇所は適宜直すようにしているのですが。 質問を投げかけているのに、回答者様にとって全てが分かりにくい内容で 本当に申し訳ございませんm(_ _)m
guest

0

2019/03/15 表示させたかった"yyyy"を"Week_No"を表示できたソース

Sub 日付表示() Dim S2 As Worksheet Dim ws As Worksheet Dim R As Long 'Selection.Value = Selection.Value '(この式は値に変換するという意味らしい) Set S2 = Worksheets("値一致") '転記先シート Set ws = Worksheets("値の元") '値の元データシート Dim iRowI As Integer '値の元データシート Dim iLastRow As Integer 'A列の最終データ行を取得する(年間カレンダーの最終行) iLastRow = ws.Range("A2").SpecialCells(xlLastCell).Row 'Calendar加工"の2行目~最終データ行までループ処理させる For iRowI = 2 To iLastRow '"Weeklyシート加工"の"F列"の最後の行になるまで実行させる For R = 2 To S2.Cells(Rows.Count, "F").End(xlUp).Row ''表示形式を年だけで表示させる(その行の値を転記させた際"yyyy"の文字列として表示させる S2.Cells(R, "A").Value = Format("2019/01/01", "yyyy") '"WK"列の値を表示させる If S2.Cells(R, "F").Text = ws.Cells(iRowI, "A").Text Then S2.Cells(R, "B").Value = ws.Cells(iRowI, "C").Value End If Next R Next End Sub

投稿2019/03/15 04:09

carrin

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問