[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『転記』(和代)
シート名”入力” では、
AB6からAB80迄が各項目名になっています
C3に月、C4に日、C5に曜日を入力します
C6列からC80迄が日々変更される数値を入力する箇所です
シート名”転記先”では、
例えば表示がC列に4月1日水だと
C3が4月の4 C4が1日の1 C5が水曜日の水が入っています
(この件は、人に頼まれたので、後日、自動的に曜日が入るように考えようと思いますが)
月と日付と曜日がC3、C4(1日)、C5からAG3、AG4(31日)AG5まで並んでいます
シート名”入力”のC3、C4、C5に入力した月日と曜日と シート名”転記先”のC3、C4、C5の同じ月日、曜日でであれば、
シート名”入力”のC6からC80迄のデータをコピーして貼り付けをしたいのです。
< 使用 Excel:Excel2007、使用 OS:Windows8 >
(和代) 2015/04/13(月) 21:58
こんな感じのことでしょうか。
Sub Sample() Dim srcWS As Worksheet Dim dstWS As Worksheet
Set srcWS = Worksheets("入力") Set dstWS = Worksheets("転記")
Dim c As Long For c = 3 To 33 If srcWS.Cells(3, c).Value = dstWS.Cells(3, c).Value _ And srcWS.Cells(4, c).Value = dstWS.Cells(4, c).Value _ And srcWS.Cells(5, c).Value = dstWS.Cells(5, c).Value Then srcWS.Range("C6:C80").Copy dstWS.Cells(6, c).Resize(75, 1) Exit Sub End If Next
MsgBox "入力の日付が見つかりません。" End Sub
シートに年の情報がありませんが、C3 に日付を入れて C4 =DAY(C3) C5 =TEXT(C3,"aaa") などが良い気がします。
C3 の書式は M にすれば、月の数字に見えます。
そうすれば、コードの比較も If srcWS.Cells(3, c).Value = dstWS.Cells(3, c).Value Then だけで済みますので。
(Mook) 2015/04/13(月) 22:23
A、下記内容を修正しましてもうまく実行できません。"入力の日付が見つかりません"と
出ます。後でチェックします。−−−
シートに年の情報がありませんが、C3 に日付を入れて
C4 =DAY(C3) C5 =TEXT(C3,"aaa") などが良い気がします。
C3 の書式は M にすれば、月の数字に見えます。
そうすれば、コードの比較も If srcWS.Cells(3, c).Value = dstWS.Cells(3, c).Value Then だけで済みますので。
(和代) 2015/04/14(火) 00:18
入力は固定でしたね。 失礼しました。
If srcWS.Cells(3, "C").Value = dstWS.Cells(3, c).Value _ And srcWS.Cells(4, "C").Value = dstWS.Cells(4, c).Value _ And srcWS.Cells(5, "C").Value = dstWS.Cells(5, c).Value Then に修正してください。 (Mook) 2015/04/14(火) 07:47
任意の月日と曜日に貼り付けがうまく出来ました。うれしいです、有難うございました。
If srcWS.Cells(3, "C").Value =のCが””があるのとないのとで違ってくるのですね。
今から用事で出かけて夜に帰りますが、帰りましたら教えて頂いた日付等の工夫をして行きます。
あつかましいお願いですが、上記VBAの意味を一行づつ教えて頂けますか?
なんとなくわかるのですが、下記時に下記単語の意味がわかりませんので‐‐‐
宜しくお願い致します。
Dim srcWS As Worksheet
Dim dstWS As Worksheet srcWS.Range("C6:C80").Copy dstWS.Cells(6, c).Resize(75, 1)
(和代) 2015/04/14(火) 11:02
ちょっと紛らわしいですが、変数の c はColumn(列)を示す変数なので、 "C" は C列を指す文字列とはまったく関係ありません。
提示の部分を説明です。 srcWS.Range("C6:C80").Copy dstWS.Cells(6, c).Resize(75, 1)
srcWS .Range("C6:C80") .Copy は 入力シートの C6:C80 をコピーします。
dstWS .Cells(6, c) .Resize(75, 1) 出力シートの c(変数)列 6行目 から 1列75行分 へ
このあたりはセルの指定範囲の書き方なので、説明サイト等を読んでみてください。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
ステップ実行はわかりますか? コードを読んで理解しようとするより、1ステップずつ実行して、そのときの 変数やシートの状態を確認すると理解しやすいと思います。 http://www.239-programing.com/excel-vba/basic/basic023.html ステップ実行 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html デバッグトレースの開始方法
(Mook) 2015/04/14(火) 11:36
上記、2015/04/14(火) 11:36付の提示の説明とサイトの3つ分有難うございました。サイトでこんなに解りやすい説明があったのかと嬉しかったです。後、じっくり見て行きます。
ステップ実行はよく使います。(F8をぽんぽん押して行きます)
シート名”入力”の日付(年も含みます)曜日の自動化が出来ました。
下記 (1)と(2)のご教授をお願い致します。色々調べたのですが、わかりません。
(1)シート名”転記”では、C列2に(西暦年)C列3に(月)C列4に(日)C列5に曜日が入っています。 そして右横並びに月末迄並んでいます。(大の月と小の月)
C列の月日と曜日を毎月オートフィルするのが面倒ですので、 ここから 依頼ですが、シート名”入力”のC3に月を入力すれば”転記”の C3列からAG列迄が月日と曜日が自動的に作成されないでしょうか?
(2) 担当者が新たな下記資料を作成して欲しいとの下記依頼がありました。
下記操作にて、貼り付けたデータのすぐ右の列に貼り付けをする方法を教えて頂きたいのです。
下記、範囲はシート名:”入力2”の表です 。
シート名:”入力2”に入力欄があります。 シート名:”転記2”にはあらかじめの1日から31日迄は、表示されずに シート名:最初のコピぺでは”入力2”でコピーしたデータをC列からF列に貼り付けします
入力2”の日付(C12:F12迄セルの結合:C12)が任意の日(例えば4月16日)に なります。
項目名がA15:B89
C列〜F列(セルの結合)の12行目は日付です。例えば4月16日のように横並びです。 C列〜F列(セルの結合)の13行目と14行目は、項目名 C15からC89迄、数字の入力 D15からD89迄、数字の入力 E15からE89迄、数字の入力 F15からF89迄、数字の入力
C15からF89迄入力した後でシート名:”転記2”のC12に日付を貼り付け、 C15からF89に数字を貼り付けをします。
次に違う任意の日付(4月20日)と入力データをシート名:”転記2”にの貼り付け先を GHIJ(セルの結合)列に、貼り付けします。 次に任意のデータの貼り付け先は KLML(セルの結合)列に同じ要領で貼り付けたデータのすぐ右の列に貼り付けをしたいのです。 貼り付け先は6日分あります。(1カ月の内、駐車場機器から現金を引き出す回数です) GHIJ(セルの結合)、KLMN(〃)、OPQR(〃)、STUV(〃)、WXYZ(〃)、 AA AB AC AD(〃)
以上宜しくお願い致します。
(和代) 2015/04/16(木) 21:23
〇数字は文字化けするので、使用しないようにしてください。 回答は後ほど。
(Mook) 2015/04/17(金) 09:11
とりあえず、(1)です。 数式でも出来ると思うので、式を入れた状態を確認してみてください。
Sub カレンダー作成() Dim 作成月 As String Dim 年 As Long Dim 月 As Long 作成月 = InputBox("作成月を入力してください。", "月指定", Format(Date, "YYYY/MM")) If InStr(作成月, "/") > 0 Then 年 = CLng(Split(作成月, "/")(0)) 月 = CLng(Split(作成月, "/")(1)) End If
If 年 < (Year(Date) - 1) Or 年 > (Year(Date) + 1) Or 月 < 1 Or 月 > 12 Then MsgBox "日付指定が正しくありません。", vbOKOnly, "終了" Exit Sub End If
Dim 転記WS As Worksheet Set 転記WS = Worksheets("転記")
Dim r As Range 転記WS.Cells.ClearContents With 転記WS.Range("C3").Resize(1, Day(WorksheetFunction.EoMonth(DateValue(作成月 & "/1"), 0))) .NumberFormatLocal = "M" .Offset(1).NumberFormatLocal = "0"
.FormulaR1C1 = "=DATE(" & 年 & "," & 月 & ",COLUMN(C[-2]))" .Offset(1).FormulaR1C1 = "=DAY(R[-1])" .Offset(2).FormulaR1C1 = "=TEXT(R[-2],""AAA"")"
.Resize(3).HorizontalAlignment = xlCenter .Resize(3).Value = .Resize(3).Value End With End Sub
(Mook) 2015/04/17(金) 09:51
(2) のたたき台です。 位置の特定と範囲の指定のやり方がわかれば、いろいろ応用できると思いますので、 位置や範囲をいろいろと変更をしてみて思うように変更できるか確認してみると良いと思います。
Sub データ転記() Dim 入力WS As Worksheet Set 入力WS = Worksheets("入力")
Dim 転記WS As Worksheet Set 転記WS = Worksheets("転記")
Dim 転記位置 For 転記位置 = 3 To 27 Step 4 If 転記WS.Cells(12, 転記位置).Value = "" Then 転記WS.Cells(12, 転記位置).Value = 入力WS.Range("C12").Value 入力WS.Range("C15:F89").Copy 転記WS.Cells(15, 転記位置).Resize(75, 4) MsgBox 転記WS.Cells(15, 転記位置).Resize(75, 4).AddressLocal(False, False) & "に転記しました。", vbOKOnly, "確認" Exit Sub End If Next MsgBox "転記先に空きがありません", vbOKOnly, "確認" End Sub (Mook) 2015/04/17(金) 11:39
〇数字は文字化けするので、使用しないようにしてください。−−−−すみませんでした、私も以前教えて
頂いたのに忘れていました。文字化けを見て気付きました。
質問:
Sub カレンダー作成()
の作成月を入力してください のところで例えば2015/4と入力してOKしてF8で」押していくと
Set 転記WS = Worksheets("転記")のところでメッセージ”インデックスが有効範囲にありません”と
でます。どうすればいいのでしょうか?
また作成月を入力してください と入力する際に、月の4だけを入れてマクロが走るようにお願いできますか?
(2)のたたき台は、色々変更して試してVBAで書かれている内容が理解出来ました。有難うございます。
ただ下記質問を教えて頂ければありがたいです。
ア)MsgBox 転記WS.Cells(15, 転記位置).Resize(75, 4).AddressLocal(False, False) & "に転記
しました。のAddressLocal(False, False) & の意味が解りませんので教えて下さい。
イ)セルの結合を4列から5列に変更しました。(合計欄を追加しましたので)
したがってWorksheets("入力")の日付は12行目のC列からG列の結合になります。
変更結果はうまく行きましたが−−−
そこで、お願いですが、
月日の貼り付けは、最初だとCDEFGを結合して、日付の罫線を外側で囲みセルの配置は縦位置、
中央揃えでお願いしたいのです。
宜しくお願い致します。
(和代) 2015/04/17(金) 18:11
>Set 転記WS = Worksheets("転記")のところでメッセージ”インデックスが有効範囲にありません”と 「転記」というシートがあるでしょうか。 >また作成月を入力してください と入力する際に、月の4だけを入れてマクロが走るようにお願いできますか? 出来なくはないと思いますが作成するカレンダーは、必ず年内のものですか? そうであれば、年月の設定部分は
年 = Year(Date) 月 = InputBox("作成月を入力してください。", "月指定")
くらいでよいと思います。 このくらいの変更はマクロの習得し初めにちょうど良いレベルですから、 御自身で出来るようになるといいですね。
>AddressLocal(False, False) 関数等に関しては、まずヘルプを見る習慣をつけてた方が良いと思います。 https://msdn.microsoft.com/ja-jp/library/office/ff194992.aspx?f=255&MSPPError=-2147217396 読んでわからない部分は質問してください。
> 月日の貼り付けは、最初だとCDEFGを結合して、日付の罫線を外側で囲みセルの配置は縦位置、 「データ転記」のコピー先のシートの罫線や配置の書式は、日付を作成し直しても 消えませんので、マクロに頼らず一回手動で設定してみてどうでしょうか。
(Mook) 2015/04/17(金) 22:18
まず転記のところで有効範囲にありませんのメッセージは、
Mookさん指摘の「転記」というシートがあるでしょうか。に対して
私:シート名:転記を転記先に変えた事を忘れていました。すみませんでした。お陰さまで有効範囲の
意味が何を言っているのかがわかりました。
Mookさん:作成するカレンダーは、必ず年内のものですか?そうであれば 年 = Year(Date) 月 = InputBox("作成月を入力してください。", "月指定")−−−例えば4月の4だけを入れましたら
転記先に1ヶ月間のひにちが曜日と共にうまく出ました。有難うございました。
しかし、転記先に表示された月は4ですが、実際には中身は2015/04/12となっていますので、
シート名:入力のC3は月欄は4だけです、したがってメッセージで”入力の日付が見つかりません”
と止まります。色々試してはいるのですが、解りません。教えて頂けますか?
質問 2、曜日が出るのはVBAの何処の箇所ですか?
質問 3、 With 転記WS.Range("C3").Resize(1, Day(WorksheetFunction.EoMonth(DateValue(月 & "/1"),
0))).NumberFormatLocal = "M" .Offset(1).NumberFormatLocal = "0"
.FormulaR1C1 = "=DATE(" & 年 & "," & 月 & ",COLUMN(C[-2]))" −−−このプログラムの意味が
わかったようでわからないのです。
教えて下さい。
関数等に関してのヘルプ見ました。有難うございます。
なんとなく理解出来たように思います。https:−−お気に入りに残します。
Mook様:コピー先のシートの罫線や配置の書式は、日付を作成し直しても
消えませんので、マクロに頼らず一回手動で設定してみてどうでしょうか。 私:手動でうまく行きました。有難うございます。
以上よろしくお願いいたします。
(和代) 2015/04/18(土) 15:48
答1 必ず当年のカレンダーを作成するのでしたら問題ありませんが、12月に1月を作っても 来年のカレンダーにはなりませんので、そのあたりは運用と照らし合わせてみてください。
カレンダーのつくりは、表示上はともかく日付にしておいた方が何かと便利ですので、 あまり、年、月、日等を分けて数字だけにするのはお勧めしません。 元の入力を日付にする方が望ましいですが、月、日が別であれば、 If srcWS.Cells(3, "C").Value = dstWS.Cells(3, c).Value _ And srcWS.Cells(4, "C").Value = dstWS.Cells(4, c).Value _ And srcWS.Cells(5, "C").Value = dstWS.Cells(5, c).Value Then を If srcWS.Cells(3, "C").Value = Month(dstWS.Cells(3, c).Value) _ And srcWS.Cells(4, "C").Value = dstWS.Cells(4, c).Value Then など、実際のデータとして同じになるようにして比較してください。
答2、3 一度下記をコメントにして実行してみて、日付のセルを確認してみてください。 ' .Resize(3).Value = .Resize(3).Value マクロがどういう式を置いているかわかるかと思います。
(Mook) 2015/04/18(土) 16:14
必ず当年のカレンダーを作成するのでしたら問題ありませんが、12月に1月を作っても来年のカレンダーには
なりませんので、−−−カレンダーの日付に入れる数字は、月々の実績です。来年は2016に変えて
1月から12月迄同じ表を作りますので、それであれば問題ないですね?
カレンダーのつくりは、表示上はともかく日付にしておいた方が何かと便利ですので、
あまり、年、月、日等を分けて数字だけにするのはお勧めしません。−−−担当者からの依頼が日付が 縦に月、日、曜日になっていたものですからそのように依頼しましたが、後日言われるように考えて 日付にします。その場合には、Mookさん記載の2015/04/18(土) 16:14より以前のVBAで出来ますね。
答2、3 一度下記をコメントにして実行してみて、日付のセルを確認してみてください。
' .Resize(3).Value = .Resize(3).Value マクロがどういう式を置いているかわかるかと思います。−−−有難うございます。落ち着きましたら 確認をします。
以上です。宜しくお願い致します。
(和代) 2015/04/18(土) 17:40
有難うございました。
今回の一連の質問は、お陰さまで完了致しました。
本当にお付き合い頂き感謝です。
次回、何かありました時には、よろしくお願いいたします。
(和代) 2015/04/18(土) 21:25
うまくいったようで何よりです。 夜遅くまでご苦労様でした。
(Mook) 2015/04/18(土) 22:10
Mookさんに終わりましたと言った以上これ以上聞くことは恥ずかしいので
自分でネットで調べたりヘルプ機能で調べたりしていたのですが、
うまく行きません。不作法ですが、もう一度御尽力頂けないでしょうか?
1点目:マクロ、カレンダ作成でシート名"転記先"の消去を転記WS.Cells.ClearContents となって
いましたが、シート名"転記先"のAB列はシート名"入力"の項目名を予めコピーしています。
その項目を残しておきたいのです。(当初しっかり確認せずに申し訳ございませんでした)
消去する範囲を、シート名"転記先"のC5:AG77にしたいのです。
シート全部ではなく一部を消去する為に、色々コードを置き換えた結果、最後に自分で下記の様に
コードを入れたのですが、F8で押していくと Range("C5:AG77").Selectで黄色が塗られアプリケーション
エラー又はオブジェクト定義エラーと出ます。
色々調べ考えて直してはみたのですが、わかりません。
'Dim 転記WS As Worksheet
'Set 転記WS = Worksheets("転記先")
Dim r As Range
Sheets("転記先").Select Range("C5:AG77").Select Selection.ClearContents With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With
'転記WS.Cells.ClearContents
最後の1点目は、同じマクロのカレンダーですが、現在C2(月)C3(日)C4(曜日)が縦列に入っています、それが右列にAG列(31日)迄あります。
カレンダーの自動入力(月日、曜日等)は、今後、日付を必要とする色々な事に応用出来ると思ったのです。
それで試しに自分で月をA1、日をA2、曜日をA3に移動しようと思い
With 転記WS.Range("C3")を("A3)に変え
.FormulaR1C1 = "=DATE(" & 年 & "," & 月 & ",COLUMN(C[-2]))"の(C[-2]))を色々変えてもエラーが出ます。
任意の場所に持ってくる方法を教えて頂きたいのですが−−−
本当に申し訳なくて、質問をしたくなかったのですが、担当者に喜んで頂く為に、お願い致します。
(和代) 2015/04/19(日) 21:46
和代さんの書いた、 Sheets("転記先").Select Range("C5:AG77").Select Selection.ClearContents でもおかしいところはないのですが、不思議ですね。
転記WS.Cells.ClearContents を 転記WS.Range("C5:AG77").ClearContents に変更してどうでしょうか。
> .FormulaR1C1 = "=DATE(" & 年 & "," & 月 & ",COLUMN(C[-2]))"の(C[-2]))を色々変えてもエラーが出ます。 の C[-2] は今いるセルの2列前、の意味ですから A列ではエラーになります。 A列の場合は何も指定せず .FormulaR1C1 = "=DATE(" & 年 & "," & 月 & ",COLUMN(C))" としてください。
ここの部分はこう書いても一緒ですが、 .Formula = "=DATE(" & 年 & "," & 月 & ",COLUMN(A1))" .Offset(1).Formula = "=DAY(C3)" .Offset(2).Formula = "=TEXT(C3,""AAA"")" 最初のセルのA1 はA1 セルを指すものではなく、列数である 1を取得するためのものなので、 A1 ではなく A99999 など A 列であればどこでもいっしょです。
2,3行目のセルは、日付セルを指すものなので、カレンダーの左上のセルに変更する 必要があります。
ですので、A3 からだと、 With 転記WS.Range("A3").Resize(1, Day(WorksheetFunction.EoMonth(DateValue(作成月 & "/1"), 0))) : : .Formula = "=DATE(" & 年 & "," & 月 & ",COLUMN(A1234))" .Offset(1).Formula = "=DAY(A3)" .Offset(2).Formula = "=TEXT(A3,""AAA"")" と書いても同じです。
(Mook) 2015/04/19(日) 22:04
さっそくにお返事頂きうれしく思います。
転記WS.Cells.ClearContents を 転記WS.Range("C5:AG77").ClearContents
に変更してどうでしょうか。‐‐‐そのように致しましたらうまく行きました。
> .FormulaR1C1 = "=DATE(" & 年 & "," & 月 & ",COLUMN(C[-2]))"の(C[-2]))を色々変えてもエラーが 出ます。‐‐‐そのあとの色々な説明は、自分で使用して(時には変更したりして変化を見て) 本当に理解できました。 方法論は一つではないと言うこともわかりました。 本当に有難うございました。
(和代) 2015/04/20(月) 00:19
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.