• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:,エクセル2000のマクロでこんな事出来ますか?)

,エクセル2000のマクロでこんな事出来ますか?

このQ&Aのポイント
  • エクセル2000のマクロを使用して、指定の条件に基づいて表を変換することは可能ですか?
  • 質問文章では、Excel形式のデータが与えられ、特定の列に特定の条件で値を反映させる必要があると述べています。
  • 具体的には、M列に指定の値が入っている場合は、対応する列に特定の値を反映させることができるかということです。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。Wendy02です。 >ここまでの私のやり方はどこがおかしいのでしょう? 私は、それは教えていませんからね。ただ、これは、予想外です。(^^; 万が一、他の人が、そのマクロで、ワークシートをめちゃめちゃにしないか、ちょっと心配です。たぶん、M列のチェックで、誤動作することはないとは思いますが、それは、むやみに他のシートで使わないように、注意してください。 もしも、シートやブックに、特定する条件(ブックの名前とかシートの名前)があるなら、それで、マクロを実行してしまわないような設定をお付けします。 それで、ツール・ボタンについてですが、少し詳しく説明すると、「ニコチャン」マークの貼り付けて保存される場所は、Excel.xlb というファイルで、Excelの基本ファイルの一部です。そうすると、マクロのほうも、個々のブックではいけないわけで、呼び出されるマクロは、個人用マクロブック(PERSONAL.XLS)というファイルになくてはいけません。(アドインでもよいのですが、アドインは、少し、また面倒です) もし、個人用マクロブックがまだ作っていないようでしたら、ツール-マクロ-新しいマクロの記録で、 マクロの保存先(I) があると思いますが、 その保存先を、個人用マクロブックにして、 どこかのセルを1個2個クリックして、 ツール-マクロ-記録終了 で終わります。 それで、Alt + F11 で、Visual Basic Editor 画面を開けて、プロジェクト・エクスプローラ(通常は、左上)で、 VBAProject(PERSONAL.XLS) というのができているはずですから、それをダブルクリックして、出来上がったばかりのマクロを探してください。おそらく、Module1 の中にあるはずです。 たとえば、Sub Macro1() ~ End Sub になっているかと思います。 そこに、今回のマクロを上書きで貼り付けてしまいます。 後は、「ニコチャン」マークの登録先を、そちらのPERSONAL.XLS!ArrangementCr を選んで、登録しなおします。 なお、「ニコチャン」マークだけでなく、メニューの表示-ツールバー-ユーザー設定-コマンド-選択したボタンの編集(M)[ボタンを選択すると、ボタンがアクティブになります]で、いろいろと選ぶことも、また、デザインを施すこともできます。 (ただし、Excel.xlbのバックアップを取っておかないと、せっかく苦心して作った、専用ボタンを失うことになります。私は、2度失って、それからは、あまり凝ったものを作るのはやめてしまいました。) >「・・・・(ファイル名)」はマクロを含んでいます。マクロを有効にしますか?が出ます。 なお、通常は、この設定は不要です。マクロは、「中」「高」でも可能です。 ツール-マクロ-セキュリティ 信頼できる発行元[タブ] 組み込み済みのアドインとテンプレートをすべて信頼する(A) にチェックを入れてください。

choroq
質問者

お礼

Wendy02さん 大変有難うございました。 上手くいきました。 このPCは他の人間が使用する事は基本的には無いのですが 私自身が誤ってクリックする事も考えられるため、ボタンはやめて ツール、マクロから選ぶようにしました。 で、次のステップにといきたいところですが、前回教えて頂いた ところでちょっと追加がありましたのでまたそこを御教授して 頂ければとあつかましくも再度質問を立てると思います。 この質問に関してはこれで閉めますが、今回は今まで以上に いろいろと勉強になりました。 本当に有難うございました。感謝申し上げます。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。Wendy02です。 遅くなりました。 >おっしゃるようにしたのですが1~3行目までがそのまま表示されてしまいます。 1~3行目をコピーしない、ということだと思いましたが、[非表示]にするということですね。 Sub ArrangementC() から '--------------------------- LastRow = Cells(START - 1, 13).End(xlDown).Row '13= M列 この行の上までを、上書きで貼り付けてしまってください。 '------------------------------------------------------ Sub ArrangementCr() 'QNo.2601172, v.1.3 Dim i As Integer Dim j As Long Dim LastRow As Long Const START As Integer = 4 'LastRow = Range("M65536").End(xlUp).Row '最下行取得 '4行目からのデータのみ表示 Rows("1:" & START - 1).Hidden = True '---------------------------------------------------- LastRow = Cells(START - 1, 13).End(xlDown).Row '13= M列 >実際に使用するのは初めてです。 そういえば、そうだったのですね。自分と同じペースのつもりで、考えてみませんでした。 >このマクロ自体をエクセルに登録する方法がいまいち理解出来ていません。 これについては、仮に、マクロの勉強を1年しても、「いまいち」は教わらないと分かりません。 Excel(Office の中でExcelだけ)は、基本的には、[標準モジュール]に登録する、ということです。なぜ、そうするかという理屈は長くなりますが、特別なことがない限りは、そこに入れてください。 [標準モジュールへの取り付け方] Alt +  F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。 次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、コードを貼り付けて、Alt + Q で、画面を閉じます。 それで、もし、すぐに使うということですと、コントロールツールで、ボタンをドラッグして、右クリックで、[マクロの登録]でつけるのが一番よいです。メニューに組み込んだり、ツールアイコンにしたりする方法もありますが、必要でしたら、ひとまず、一通り、実行部分が終わってから書き出します。

choroq
質問者

お礼

Wendy02さん 有難うございました。 私の意図している事が出来ました。 で、登録に関してですが、 >Alt +  F11 (Altを押しながらF11)を押すと、Visual Basic Editor >画面が出てきます。 >次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、>画面が現れますので、コードを貼り付けて、Alt + Q で、画面を閉じます。 その後、ツール、ユーザー設定、コマンドタブのマクロを選択、で横のニコニコマークをツールバーへドラッグ、と行いました。 次に新規作成でエクセルを立ち上げて適当に文字を入れて、ニコニコマークをクリックすると 先程のマクロを掛けて保存したファイル名、保存場所が出て 「・・・・(ファイル名)」はマクロを含んでいます。マクロを有効にしますか?が出ます。 はいをクリックすると実行はされるのですが何故前のファイルの名前が表示されるのでしょうか? ここまでの私のやり方はどこがおかしいのでしょう?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。Wendy02です。 こんな感じになりました。 もし、最初のデータ位置が変わるようでしたら、  Const START As Integer = 4 'タイトルは3行目 の数字を書き換えてください。 Sub ArrangementC() 'QNo.2601172, v.1.2 Dim i As Integer Dim j As Long Dim LastRow As Long Const START As Integer = 4 'タイトルは3行目 'LastRow = Range("M65536").End(xlUp).Row '最下行取得 '4行目からのデータのみ表示 LastRow = Cells(START - 1, 13).End(xlDown).Row '13= M列 If LastRow < START + 1 Or LastRow > 65535 Then MsgBox "シートが違うか、データがありません。", vbCritical: Exit Sub ''項目 必要になったら、外してください。 'Range("AE" & CStr(START - 1)).Resize(, 3).Value = Array("上", "中", "下") For i = 1 To 30  Select Case i     'M, P, Q, T, V   Case 13, 16, 17, 20, 22   Case Else: Columns(i).Hidden = True  End Select Next i Application.ScreenUpdating = False For j = START To LastRow   Select Case Cells(j, 13).Value    Case "東京", "大阪"   'M列に「東京」「大阪」と入った場合には同じ行のT列の数値をAE列に反映    If Cells(j, 22).Value <> "" Then      Cells(j, 31).Value = Cells(j, 20).Value    Else      Cells(j, 22).EntireRow.Delete      j = j - 1    End If   'M列に「名古屋」と入った場合には   Case "名古屋"     If Cells(j, 22).Value <> "" Then       'T列の数値をAF列に反映。       Cells(j, 32).Value = Cells(j, 20).Value     Else       Cells(j, 22).EntireRow.Delete       j = j - 1     End If   Case "福岡"     '「福岡」と入る場合は、AG列に反映     Cells(j, 33).Value = Cells(j, 20).Value     'V列が必ず空白の状態     Cells(j, 22).ClearContents   End Select Next j Application.ScreenUpdating = True End Sub >これはそのデータを別のファイルにコピーするマクロって意味ですか? >私の場合そのデータを別のファイルにコピペする事になるのですが >便利な方法もあるのでしょうか? それは、もう前から予想していました。 ただ、そのコピぺですが、もしかしたら、見えているまま、つまり、隠れている列は入れないで、コピーということではないでしょうか?シート名は、年と月を入れるとか? そんな風に想像しています。 わたし流の作り方は、ブックを開いていないときは、ブックを開き、ブックが開いている時は、そのまま、コピペという形にします。シートをどのように指定していくか、とか、どこに貼り付けるか、とか、ある程度情報をいただいて、今のものがOK出れば、次に移ります。

choroq
質問者

お礼

Wendy02さん 有難うございました。 おっしゃるようにしたのですが1~3行目までがそのまま表示されて しまいます。 どこか私のやり方がおかしいのでしょうか? それとコピペに行く前に 大変初歩的な質問ですが、今までマクロなるものを見た事があっても 実際に使用するのは初めてです。 で、今回も何とか見よう見まねでこのマクロを実行させるところまではわかるのですが、 このマクロ自体をエクセルに登録する方法がいまいち理解出来ていません。 エクセルを立ち上げるといつでもこのマクロが実行出来るように登録したいのですが どのようにすれば良いのでしょう? 今更ながらお手数をお掛け致します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。Wendy02です。 choroqさんとのQ&Aは、もう回を重ねていますので、ある程度の想像は付きます。 >今回の表に関しては下に付け加える事は特にないのですが >その場合でもこのマクロで宜しいのでしょうか? 可能です。ただ、その場合、M列には、空白セルが途中にあるとダメです。 だから、そんな場合は、実際は、こんな風にして、最下行を取っても可能なのです。 LastRow = Range("M30000").End(xlUp).Row ' 3万行より上のデータのある最終のデータ行という意味です。実際には、3万行もあるシートというのは、よほどのものですからね。 >AE,AF,AGには最上行の項目が空白です。 If LastRow < 2 Or LastRow > 65535 Then MsgBox "シートが違うか、データがありません。", vbCritical: Exit Sub '←7行目 上から7行目の次に、以下のコードを入れてください。 Range("AE1").Resize(, 3).Value = Array("上", "中", "下") そうすると、今度は、シート・コピーマクロかな? これは、今のマクロには続けないで、別に作ったほうがよいかもしれません。

choroq
質問者

お礼

Wendy02さん お礼が遅くなりました。 本日確認したところ問題ありませんでした。 ただ前回項目に空白があるとか言い出したものでわざわざ補足の 御回答を頂きましたが、ようは内容をコピペするだけなんだから データのみで良かったんです。 まったく余計なお手間を取らせてしまいました。 さらに前回の御教授を無視するようで恐縮ですが上から3行目までは 項目やタイトルが入っているのでまったく必要ありません。 4行目からのデータのみ表示させれば十分なんですが、合わせて教えて 頂ければ幸いです。 >そうすると、今度は、シート・コピーマクロかな? >これは、今のマクロには続けないで、別に作ったほうがよいかもしれません。 これはそのデータを別のファイルにコピーするマクロって意味ですか? 私の場合そのデータを別のファイルにコピペする事になるのですが 便利な方法もあるのでしょうか? 次から次へと質問攻めで申し訳ありません。

choroq
質問者

補足

Wendy02さん 有難うございました。遅くなり申し訳ありませんでした。 これでおそらく大丈夫だと思うのですが月曜日からデータが送られて きますので、しばらく様子を見てそれで何か問題があれば再度補足 させて頂きます。 もちろん問題が無ければきちんと御礼の方も書かせて頂きます。 勝手を言いますがお許し下さい。 若干お時間頂きますが必ず報告させて頂きますので今しばらく お待ち下さい。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。Wendy02です。 >プロシージャの外では無効です たぶん、どこか、Sub ~ End Sub の外に、余計なものが書かれているのではないかと思います。もし、見つかるようでしたら、その部分を削除して試してみてください。 そうでなければ、一旦、前のものを全部消して、[標準モジュール]に、何も書かれていない空の状態して、ここのコードを貼り付けてみてください。 特に、その部分でエラーがあるとは思えません。 なお、こちらでも、Excel2000 でのチェックは済んでいます。

choroq
質問者

お礼

Wendy02さん。すみません。 書き込んでいる間にすでに回答して頂いたみたいで行き違いになってしまいました。 ↓の御礼の欄は無視して下さい。 Range("M1").End(xlDown).Rowを入れたら 上手くいきました。 きちんと読まずに早とちりして申し訳ありませんでした。 しかし今回の表に関しては下に付け加える事は特にないのですが その場合でもこのマクロで宜しいのでしょうか? 実際にこのデータは日々のデータですので完成後データをコピペして 別のファイルに一ヶ月分として集計していく形です。 それと、追加なんですが AE,AF,AGには最上行の項目が空白です。 それぞれ仮に「上、中、下」と入れたい場合はどうすればよいのでしょう? それも合わせてマクロで行うにはどうすれば良いのでしょう?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 いつも、お仕事大変ですね。 以下を試してみてください。一応、条件は含まれているはずです。 厳密に言うと、以下のコードは、ロジックとしては、ちょっと問題があるところがあります。それは、最下行のとり方(最下行取得)が、確か、choroq さんの作られているシートの場合は、その下に加えることがあったように思います。その場合、M列に入れてあると、誤動作しかねません。その場合、 Range("M65536").End(xlUp).Row ではなく、 必ず、データが入っているという条件の下ですが、 Range("M1").End(xlDown).Row  のほうが良いかもしれません。 '標準モジュール '------------------------------------------- Sub ArrangementB() 'QNo.2601172, v.1.1 Dim i As Integer Dim j As Long Dim LastRow As Long LastRow = Range("M65536").End(xlUp).Row '最下行取得 'LastRow =Range("M1").End(xlDown).Row If LastRow < 2 Or LastRow > 65535 Then MsgBox "シートが違うか、データがありません。", vbCritical: Exit Sub For i = 1 To 30  Select Case i     'M, P, Q, T, V   Case 13, 16, 17, 20, 22   Case Else: Columns(i).Hidden = True  End Select Next i Application.ScreenUpdating = False For j = 2 To LastRow   Select Case Cells(j, 13).Value    Case "東京", "大阪"   'M列に「東京」「大阪」と入った場合には同じ行のT列の数値をAE列に反映    If Cells(j, 22).Value <> "" Then      Cells(j, 31).Value = Cells(j, 20).Value    Else      Cells(j, 22).EntireRow.Delete      j = j - 1    End If   'M列に「名古屋」と入った場合には   Case "名古屋"     If Cells(j, 22).Value <> "" Then       'T列の数値をAF列に反映。       Cells(j, 32).Value = Cells(j, 20).Value     Else       Cells(j, 22).EntireRow.Delete       j = j - 1     End If   Case "福岡"     '「福岡」と入る場合は、AG列に反映     Cells(j, 33).Value = Cells(j, 20).Value     'V列が必ず空白の状態     Cells(j, 22).ClearContents   End Select Next j Application.ScreenUpdating = True End Sub '-------------------------------------------

choroq
質問者

お礼

Wendy02さん 早々に有難うございます。 実行してみたのですがエラーが出ます。 「コンパイルエラー プロシージャの外では無効です」 と表示され LastRow = Range("M65536").End(xlUp).Row '最下行取得 の部分の xlUp のところが反転された状態です。 私のやり方がどこかおかしいのでしょうか・・・? それとも何か説明不足なのでしょうか? 宜しく御教授下さい。

choroq
質問者

補足

Wendy02さん。すみません。 ↓の御礼の欄は無視して下さい。 Range("M1").End(xlDown).Rowを入れたら 上手くいきました。 きちんと読まずに早とちりして申し訳ありませんでした。 しかし今回の表に関しては下に付け加える事は特にないのですが その場合でもこのマクロで宜しいのでしょうか? 実際にこのデータは日々のデータですので完成後データをコピペして 別のファイルに一ヶ月分として集計していく形です。 それと、追加なんですが AE,AF,AGには最上行の項目が空白です。 それぞれ仮に「上、中、下」と入れたい場合はどうすればよいのでしょう? それも合わせてマクロで行うにはどうすれば良いのでしょう?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。Wendy02です。 一応、今回、今までのやってきた一連のものを一つのブックまとめて、choroq さん専用にしました。そうしないと、どうしてもはっきり分からない部分が出てきてしまいます。 >5列の表にした上でそこに3列を増やしたいのです。 >A~ADを ということは、物理的に、AE,AF,AG の三つの列を使うのはないでしょうか。 そういう方針で、これは作られています。 おそらく、その出された条件で、まだ抜けている部分があるのかもしれませんが、最初のものとして提示しておきます。 '標準モジュールに貼り付けてください。 '---------------------------------------------------- Sub ArrangementA() Dim i As Integer Dim j As Long Dim LastRow As Long LastRow = Range("M65536").End(xlUp).Row If LastRow < 2 Then MsgBox "シートが違うか、データがありません。", vbCritical: Exit Sub For i = 1 To 30  Select Case i     'M, P, Q, T, V   Case 13, 16, 17, 20, 22   Case Else: Columns(i).Hidden = True  End Select Next i Application.ScreenUpdating = False For j = 2 To LastRow   Select Case Cells(j, 13).Value    Case "東京"     Cells(j, 31).Value = Cells(j, 20).Value   'M列に「大阪」又は「名古屋」と入った場合には   Case "大阪", "名古屋"     If Cells(j, 22).Value <> "" Then       'T列の数値をG列に反映。       Cells(j, 32).Value = Cells(j, 20).Value     Else       Cells(j, 22).EntireRow.Delete       j = j - 1     End If   Case "福岡"     Cells(j, 33).Value = Cells(j, 20).Value   End Select Next j Application.ScreenUpdating = True End Sub '----------------------------------------------------

choroq
質問者

お礼

Wendy02さん いつも本当に有難うございます。 またお世話になります。 >ということは、物理的に、AE,AF,AG の三つの列を使うのはないでしょうか。 >そういう方針で、これは作られています。 その通りです。私の勘違いでした。 申し訳ありません。 で、よくよく確認したところ、私の説明に誤りを発見しましたので訂正してお詫び致します。 いつもの事ながらすみません。 ●M列に「東京」「大阪」と入った場合には同じ行のT列の数値をAE列に反映。但しV列が空白の場合もあります。 で、そのV列が空白の場合はその行ごと削除して全く表示も反映もさせないようにしたいです。 ●M列に「名古屋」と入った場合は同じ行のT列の数値をAF列に反映。 但しこの場合もV列が空白の場合もあります。その場合は上と同じようにはその行ごと削除して全く表示も反映もさせないようにしたいです。 ●M列に「福岡」と入った場合には同じ行のT列の数値をAG列に反映。但しこの「福岡」と入る場合はV列が必ず空白の状態です。 以上ですが何か不明な点があれば御指示下さい。

  • toshi_2000
  • ベストアンサー率30% (306/1002)
回答No.1

マクロで可能です。 どの部分が分からないのか教えていただければ、回答できると思います。

choroq
質問者

お礼

早々に有難うございます。 恥ずかしながらすべてです。 何卒宜しくご教授下さい。

関連するQ&A

専門家に質問してみよう