グッドデザイン賞を受賞したウォーターサーバー >>

エクセルのマクロについてです。
作成者がやめてしまい、マクロができる人がおらず困っています。
画像のようなエクセルのリスト(これはシート2とします。)を使用しており、別のシステムからコピペしたデータをシート1に貼り付けてシート3に必要な情報のみを抽出(VLOOKUP関数仕様)した表を作成し、シート2の表のセル(=シート3!B7の式をいれてます)に反映させて下の行にドラッグしています。
リスト上のマクロボタンは、B7を基準にそこからD列までなのかはたまたI列までなのかは不明ですが、昇順になるようになっています。
それで昇順にし終わったらシートを印刷するといったマクロが組まれていました。
今回のことは、マクロを組まなくても出来ることではあり、作成者がいた時は大量に件数が無かったので改ページ挿入をいちいちしておりましたが、ここ最近大量に来る日もあるので印刷範囲を可変にして印刷出来るようになったらいいネと話が出ました。
今回載せた画像のリストは10件までを表示して作成していますが、本物のリストは1500件くらいまで対応出来るようになっています。

ここで質問です。
印刷範囲を1ページ35行ずつで、最終ページだけシート3で抽出したデータがシート2に反映されてる最終行まで【最終ページだけ33行まで反映されてれば33行まで】+対象件数をきちんとコピペしてるか通番を見て確認するための1行【対象総件数が500件なら1番最後の行の通番が501になってるかで確認するため】)にしたいです。
また、1500件分に対応するように作っており、抽出したデータが500件ならば1000件分反映されないセルが残ってしまいます。
この1000件のうちの1行は必要なので残りの999件は印刷範囲に入って欲しくない場合、どうやってマクロを組めばいいでしょうか?
可能なことなのでしょうか?
手動で修正した方がこのマクロを考えるよりも遥かに楽なのは承知なのですが、もし出来るのであれば教えていただきたいです。

おわかりになる方、無知なこの私にお知恵をお貸しください。
今組まれてるマクロの文章は画像の通りです。
塗りつぶしてるのはシート名で全て同一のシートです。
今回載せたエクセルのリストはマクロを修正したいExcelファイルと同一のものではなく、このようなリストだということをお見せするために私物のパソコンで作成したものです。
抽出日付の列は表示形式が日付になっています。他は標準になっていたと思います。

「エクセルのマクロについてです。 作成者が」の質問画像

質問者からの補足コメント

  • 画像見にくくて申し訳ございません。
    こちらに見やすいの載せておきます。

    「エクセルのマクロについてです。 作成者が」の補足画像1
      補足日時:2019/04/09 23:45
  • お礼を書いた後に気付いてまたお礼をしようとしたらお聞き出来なくなったので補足の方に書かせていただきます。
    貼り付けるデータの数なのですが、日によってばらつきがあり、30件の時もあれば500件などあります。(前日の集計を翌日抽出してリストを作成して利用してます。)
    なので、データの入ってる行の一番下の行までを最下行というと最下行についてはバラツキがあるのですが。。。

      補足日時:2019/04/10 08:39
  • お返事ありがとうございます。
    分かりにくくて申し訳ございません。
    はい、仰られた通りのエラーが入っております。
    教えてくださった関数はエラーが表示されてるセルに入力すればいいのでしょうか?
    また、1ページの印刷範囲を35行にして最後の行だけ最終行+1行にしたいのですが、
    1ページを35行にするのはどうやればいいでしょうか?
    質問ばかりで本当に申し訳ございません。

      補足日時:2019/04/10 11:36
  • ifの関数を使用してシート2で反映するデータがなくてエラーの出てるセルは空欄にはなりました。
    その後、教えて頂いたマクロを入れてみたのですがエラーが出てしまいました。
    あと家のパソコンで試して見てるので印刷はせずに印刷範囲がきちんと出来てるか見たいので印刷プレビューに変えてます。
    私が無知すぎるが故に色々教えて頂いてるのにも関わらず出来なくて申し訳ございません。

    「エクセルのマクロについてです。 作成者が」の補足画像4
      補足日時:2019/04/10 20:44
  • コピペの内容はこれで完全OKでしょうか?

    「エクセルのマクロについてです。 作成者が」の補足画像5
      補足日時:2019/04/10 23:11
  • 今教えて頂いたマクロを入れて行の高さが大きかったのか小さくしたら通番35行ずつで出来ました!(入力件数は105件まで)
    かつ、空欄の行もはいってはいたのですが、1ページは通番35まで2ページは通番70まで
    3ページは通番105までで4ページ目で空欄の106行目が入ってました。
    この後、200番目まで試しに入れたら空欄の200番目まで6枚目にプレビューされてきてしまいました。(最下行は201番目に当たる空欄になってます。)
    シート2のB列からD列にシート3のデータが反映されてるとこまで+通番だけが入った空欄の直下1行だけが欲しかったのでこれだと通番だけが入っているだけの必要のない行が沢山印刷されてしまうのでこれは不要なのですが、印刷範囲に入らなくなるでしょうか?
    多分私が最初1ページ35行数指定とか言ってたからこうなったんですよね(すみません)

    「エクセルのマクロについてです。 作成者が」の補足画像6
      補足日時:2019/04/11 00:10

A 回答 (12件中1~10件)

たぶん、他の方法(zongaiさんのアドバイス)を続けて検討されているので、私のNo.6、No.7の回答の方式はいらないのだろうとは思います。

 が、コメントがありましたので、補足させていただきます。

コメント:
シート1で貼り付けてるデータをVLOOKUP関数を使用してシート3に反映させてるので500件分のみしかデータがない場合、501件以降には#N/Aと表示されており、シート2はシート3に反映されてるデータをそのまんま引っ張ってきてるのでシート2の501件以降にも#N/Aと表示されております。
分かりにくくて申し訳ございません。

補足:
No.6の方式は、Sheet2には1500行目くらいまで(200行目でも構いませんが)、Sheet3のセルを参照して値を表示する式が存在し、そのSheet2のセルに書かれている式は一切変更しないことにしています。 No.6の方式は、Sheet2の印刷設定を指定するだけのものです。 No.6の方式を実行すると、Sheet2の中で、#N/Aと表示されているセルが数千あっても、その数千のセルの中で一番上の行にあるセルの直上の行(#N/Aと表示されているセルの一番上がB408ならば407行目、#N/Aと表示されているセルの一番上がB501ならば500行目)までを印刷し、その行よりも下(408行以下、501行以下)は印刷しないようになります。 そして、印刷は、各ページとも(タイトルの7行分とデータが35行分)セットで印刷されます。
つまり、(Sheet3にあるセルの式がVLOOKUPで検索できないと#N/Aのエラーになっているため)Sheet3を参照するSheet2にエラーが表示されていることを利用して、有効なデータのある行を判定しているのです。
もしも、印刷する各ページにはタイトルの7行分はいらない、データと通番号だけを35行/頁にしたいのであれば、No.6のコードを次のようにするだけです。

Sub MacroSample()
Dim rng As Range
On Error Resume Next
Set rng = Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If Not (rng Is Nothing) Then
r = rng.Row - 1
End If
Application.PrintCommunication = False
ActiveSheet.PageSetup.PrintArea = "$A$8:$D$" & r
ActiveSheet.PageSetup.PrintTitleRows = ""
ActiveSheet.ResetAllPageBreaks
For i = 43 To r Step 35
ActiveSheet.Rows(i).PageBreak = xlPageBreakManual
Next
Application.PrintCommunication = True
End Sub
    • good
    • 0

> 通番35行ずつで出来ました!(入力件数は105件まで)



ここは希望通りということですよね。

> かつ、空欄の行もはいってはいたのですが、1ページは通番35まで2ページは通番70まで
> 3ページは通番105までで4ページ目で空欄の106行目が入ってました。

データ数が105だから、106行目は4ページ目になるのは当然ですよね?
希望とは違うのですか?

> この後、200番目まで試しに入れたら空欄の200番目まで6枚目にプレビューされてきてしまいました。(最下行は201番目に当たる空欄になってます。)

6ページ目は176~210番目に当たるので、6ページ目のプレビューに入るのは当然ですよね。
データ数が200なので、プラス1行の201番めが追加されています。(おかしいの?)

通番ってシート2のA列に1500番まで入っているんじゃないのですか?
消す理由なんかないと思うのでその前提で作ってますが。

通番201が空欄なのは、あなたが空欄にしたのですか?

> シート2のB列からD列にシート3のデータが反映されてるとこまで+通番だけが入った空欄の直下1行だけが欲しかったのでこれだと通番だけが入っているだけの必要のない行が沢山印刷さ
>れてしまうのでこれは不要なのですが、印刷範囲に入らなくなるでしょうか?

印刷範囲外になるようにはしてるんですけどね。
200番までデータが入っているから画像のようになってるんじゃないの?

シート2のB列の空欄に見えてるセルって、何が入ってるんですか?
たとえばB207の中身とか。

-------------------------------------------------

教えて下さい、という投稿だったので、要所要所で説明も書いたりしてたんですが、
「動作がおかしい、直して」のオーダーになっちゃってますね。
急ぎ返事を書きたいからということでここは仕方ないとしても・・・

コピペうまくできてるか画像見て確認してくれなんて、それは自分でやることですよ。
ちょっと厚かましすぎです。

-------------------------------------------------
★気になったこと

①の投稿に添付されたA列は「リスト番号」
②補足で投稿されている印刷イメージのA列は「通番」

①のシートを出力するんじゃないの?
どこから「通番」という文字が出てきたの?
同じシートじゃないの?

★通番って、B列に書いてない?

No.2の回答で書いた内容を改めて書きます。
最下行取得をB列(2列目)にしているの理由は、
【1列目は通し番号で、情報入力のない1500番(?)まで入力されている】と思ったので、最下行取得に向かないと判断。
【2列目は顧客番号なので、情報入力のある場合は確実に入力されている】と判断したためです。

通番を200まで入れて、それを基準にページ区切りが入っているように思います。
つまり、通番がB列になっていると思うのですが、いかがですか?

情報入力がある場合、確実に入力のある項目はどれですか?
仮に「顧客番号」だとします。
「顧客番号」は何列目にかかれていますか?
通番が2列めなら、顧客番号は3列目でしょうか。
だとしたら、最終行を取得するのは3列目である必要があります。

matubi = Cells(Rows().Count, 【2】).End(xlUp).Row

この【】の部分の数字が3でなければなりません。(No.1で説明してます)
この【】は不要です、数字「3」だけ入れます。

この回答の最初に書いたことは後回しでいいです。
とりあえず、この最後に書いた、数字の書き換え「2」→「3」(顧客番号の列)をしてみて下さい。
    • good
    • 0

補足コメント(2019/04/10 23:11)拝見しました。


元からコピペし直したなら大丈夫だと思いますが…。
(最後の1行はご自身で追加されたのですよね)

その確認、回答者にさせます?( ̄_ ̄;)

ついでに実行結果も書いていただけると良かったんだけど。
    • good
    • 0
この回答へのお礼

すいません、最後の1文以外でお願いします。

お礼日時:2019/04/11 00:13

すみません、3行じゃなく、もう1行で


4行抜けです。
    • good
    • 0

他の方の回答もあるので、混乱されるかもしれませんが…



補足日時:2019/04/10 20:44
こちらは私の作った方のようなので、また回答投稿しますね。

画像にあるエラーは、コピペしてる内容が不十分だからです。
↓この頭に⬛を付けた3行が欠けています。

⬛'最下行を取得するよ――――
⬛matubi = Cells(Rows().Count, 2).End(xlUp).Row
⬛Do While WorksheetFunction.CountBlank(Cells(matubi, 2)) = 1
matubi = matubi - 1
Loop

余裕があれば、改めてコピペ等見直してみて下さい。
    • good
    • 0

> 今日の件数は、50件くらいでしたので改ページプレビューで印刷範囲を指定したので500までは範囲指定されてはいません。

 いつも手動でやってるのでそのせいですね。

改ページプレビューでやってもいいのですが、だいたいが決まり切った様式で、意味のある有効行数が40,53,78,123,236,367,982,1357のようになるSheet2を、全部35行分/頁で印刷するor全部41行分/頁で印刷するという程度ならば、タイトル設定、改ページ設定をすれば、あとは、手動で[印刷]をすれば、全ページが連続して印刷されます。

> 通し番号を見てきちんと抽出対象件数分あることを確認したいので、通し番号は欲しいのですが。。 通し番号アリでの方法が知りたいです。

3)現状では、Sheet2のA列は、8行目~1500行目まで1からの通し番号を入れてあるのでしょうか。
3)はい、そうです。

そうならば、
ActiveSheet.PageSetup.PrintArea = "$A$1:$D$" & r
これで、A列の通し番号も印刷されます。
つまり、全ページに、通し番号付きで印刷されます。
なお、Sheet2のどこかのセルにエラーがある前提で「MacroSample()」はできていて、エラーの出てくる一番上の行の1つ上の行までで、印刷は終わります。エラーのあるセルの行を含む下の行は一切印刷されません。

4)現状では、Sheet2の[$B$8:$D$1500]あるいは[$B$8:$I$1500]に、Sheet3のセルを参照する式が入っているのでしょうか。
4)そうです!
5)現状では、Sheet3のデータ数が400件の場合、Sheet2のB407はきちんとデータが表示されていて、B408は、#N/Aのように(Sheet3で参照してるセルの表示と同じ)になっているのでしょうか。
5)仰る通りです。

Sheet2のどこかには#N/Aがでているハズですが、どこにも#N/Aががないとなると、このコードのままだと、動作が狂います。

このコードは印刷設定をするだけなので、印刷は手動でやる前提にしてあります。紙をセットして、プリンターを選んで、プリンターのプロパティを設定しては、手動でやってください。 あとはexcelに戻って、Sheet2を表示させて、印刷をすれば、全ページが連続して印刷されます。
    • good
    • 0
この回答へのお礼

度々申し訳ございません。
シート1で貼り付けてるデータをVLOOKUP関数を使用してシート3に反映させてるので500件分のみしかデータがない場合、501件以降には#N/Aと表示されており、シート2はシート3に反映されてるデータをそのまんま引っ張ってきてるのでシート2の501件以降にも#N/Aと表示されております。
分かりにくくて申し訳ございません。

お礼日時:2019/04/10 19:56

脇から済みません。


1)現状は、Sheet2のページ設定のシートでタイトル行を[$1:$7]のようにされているのでしょうか。
2)現状では、Sheet2のページ設定の印刷範囲はどうなっているのでしょうか。
印刷しようとするときに、手動で印刷範囲を設定しているのでしょうか。
例えば、[A1:I501]のようにされているのでしょうか。
3)現状では、Sheet2のA列は、8行目~1500行目まで1からの通し番号を入れてあるのでしょうか。
4)現状では、Sheet2の[$B$8:$D$1500]あるいは[$B$8:$I$1500]に、Sheet3のセルを参照する式が入っているのでしょうか。
5)現状では、Sheet3のデータ数が400件の場合、Sheet2のB407はきちんとデータが表示されていて、B408は、#N/Aのように(Sheet3で参照してるセルの表示と同じ)になっているのでしょうか。

もしも、3)4)5)がハイであって、【印刷は、各ページに1~7行目も印刷する】【最終ページは407行目(データの400件目)までで終わり、408行目以降はA列の遠し番号も印刷しない】ので構わないのであれば、次のようなコードでも、良いと思います。

Sub MacroSample()
Dim rng As Range
On Error Resume Next
Set rng = Cells.SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If Not (rng Is Nothing) Then
r = rng.Row - 1
End If
Application.PrintCommunication = False
ActiveSheet.PageSetup.PrintArea = "$A$1:$D$" & r
ActiveSheet.PageSetup.PrintTitleRows = "$1:$7"
ActiveSheet.ResetAllPageBreaks
For i = 43 To r Step 35
ActiveSheet.Rows(i).PageBreak = xlPageBreakManual
Next
Application.PrintCommunication = True
End Sub

上のマクロを、Sheet2をアクティブにしておいてから実行すると、エラーのあるセルの1行上の行までを、A列~I列の範囲で、各印刷ページの上部に1~7行目をタイトルとして印刷する設定になります。
For i = 43 To r Step 35 は、印刷改ページ設定で、実質35行毎の改ページ、
第一ページが(タイトル7行+35行=42行)なので、最初の改ページが43行目の上で、
(実質35行)毎で、エラーのある行(r)の上で終わり

あとは印刷をします。
    • good
    • 0
この回答へのお礼

いえいえ、とても助かります!

1)現状、タイトル行の指定はなしでした

2)仰る通りです。
今日の件数は、50件くらいでしたので改ページプレビューで印刷範囲を指定したので500までは範囲指定されてはいません。
いつも手動でやってるのでそのせいですね。

3)はい、そうです。

4)そうです!

5)仰る通りです。

通し番号を見てきちんと抽出対象件数分あることを確認したいので、通し番号は欲しいのですが。。

本当に申し訳ございません。
でも見つけて回答して下さり、ありがとうございます!
もしお時間あるなら通し番号アリでの方法が知りたいです。

お礼日時:2019/04/10 14:52

> 教えてくださった関数はエラーが表示されてるセルに入力すればいいのでしょうか?



エラーが入ってるセルだけに関数を入れるなら、はじめからエラー選択肢て削除したほうが早いですが。
私の回答は、シート2で「=シート3!B7」のように書いてある全セルをイメージしてました。

補足コメントされるのはいいのですが、そのエラーが何なのかも補足すべきですよ。
ついでに、そのエラーに関しての問題が解消されたのかどうかも含めて。


エラーの問題解消済みとして・・・
35行区切りというのも漠然としてるので、勝手なイメージで作ってみました。
とりあえず確認してみて下さい。
(印刷範囲も指定するようにしたので、行の非表示処理は無くしました。)


Sub 昇順と印刷()
'
' 昇順と印刷 Macro
'

'
'最下行を取得するよ――――
matubi = Cells(Rows().Count, 2).End(xlUp).Row
Do While WorksheetFunction.CountBlank(Cells(matubi, 2)) = 1
matubi = matubi - 1
Loop
'印刷範囲を初期化するよ――――
ActiveSheet.ResetAllPageBreaks
ActiveSheet.PageSetup.PrintArea = ""
'印刷範囲を設定するよ(7行目 項目行は全ページに印刷)
With ActiveSheet.PageSetup
.PrintArea = "$A$7:$I$" & matubi + 1
.PrintTitleRows = "$7:$7"
End With
i = 8: j = 0
'ページの区切りを入れるよ――――
Do While i <= matubi + 1
i = i + 35: j = j + 1
ActiveSheet.HPageBreaks.Add before:=Cells(i, 1)
Loop
'印刷するよ――――
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False
End Sub
    • good
    • 0

> 500件分反映されたとして501件からは参照するデータがないためエラーが表示されてるのですが、このエラーになる部分は非表示にしてくれるというマクロなのでしょうか?



参照するデータが無いとエラーになるの?
どういうエラー?(「#N/A」?)参照元のシート3の時点でエラーになってるの?
(↑こういう情報も大事です)

このままだとNo.2の回答のは使えないかな・・・。

> シート2の表のセル(=シート3!B7の式をいれてます)に反映させて下の行にドラッグしています。

シート3のエラーを反映してきちゃっているなら、こういう式に置き換えるのもありかな。

=IF(ISERROR(シート3!B7),"",シート3!B7)

もし、シート3でエラーなら、空欄(””)。エラーでなければシート3の情報を反映。


質問や補足が、処理の流れだけ書いててわかりにくいです。
シート構成を明確に。
聞きたいことは完結に箇条書きに。
細かいことは更に補足すればわかりやすくなると思います。

例えば...

◼シート1 
別のシステムからデータをコピペ。
◼シート2
シート1の情報から必要な情報をVLOOKUP関数で抽出。
該当がない場合は「#N/A」になっています。(←こういう情報も)
◼シート3
印刷用のシート。
シート2の情報を「=シート3!B7」の様に直接参照しさせ、マクロで印刷させます。

★やりたいこと
データの最終行+1行までを印刷するようにしたい。

...とか。
細かく文章で書かれておられると思いますが、文章だけで書かれちゃうと把握し辛いです。
    • good
    • 1

印刷するシート2は、入力がない行は空欄ではなくてシート3を参照している関数が入っているから動作がうまくいかないってことかな。



matubi = Cells(Rows().Count, 2).End(xlUp).Row
Do While WorksheetFunction.CountBlank(Cells(matubi, 2)) = 1
matubi = matubi - 1
Loop
Rows(matubi + 2 & ":" & Rows().Count).EntireRow.Hidden = True
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False
Rows(matubi + 2 & ":" & Rows().Count).EntireRow.Hidden = False

Do~Loopで、空欄行を考慮して最下行を取得するようにしてみました。

とりあえずこれでお試しを。
実際のシートの状態がわからないので噛み合わない部分もあるかもしれません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QExcelで「令和」と表示されるのは5月1日にならないとだめですか?

「日本の新元号に関する Office の更新プログラム」というページ(下記)で、
「Windows と Office の更新プログラムを適用済みの場合でも、Windows 上で実行されている Office 製品は 2019 年 5 月 1 日に新元号が開始されるまで、新元号を表示しませんのでご注意ください。」
と書かれています。
https://support.microsoft.com/ja-jp/help/4478844/office-updates-for-new-japanese-era

今月4月中に、Excelのセルに来月5月以降の年月日を入力した場合に、自動で「令和」という元号を表示させることはできないのでしょうか。

もし、できるということであれば、「2019 年 5 月 1 日に新元号が開始されるまで、新元号を表示しません」とはどのような意味なのでしょうか。

Aベストアンサー

>こちらでは、「4月17日以降にOfficeも更新されれば「令和元年」と表示されると思います」と書かれているんですが

その方は、Microsoftの方ではないですし個人の予想ですよね?公式が出ているのにそれを持ち出してどうするんですか?

5/1より前に新しい元号を表示したい場合は数式や表示形式で限定的に表示させる方法を色々な方が考え付いていますよ。
検索すればたくさん出てきます。

QGoogle検索をして、その下に検索結果(URL)を表示

A列1行から、ずっと右へキーワードが記入されています。
調べたいキーワードは、400近くあります。

その1行目にあるキーワードをGoogle検索をして、
検索結果のURLだけを、そのキーワードの下に表示させたいです。

検索結果は全部で10ページくらい、大体100個のURLになるかと思います。
(youtube動画や広告などは含めないです)

このようなことは、Excelのマクロでできるでしょうか?
できるとしたら、どのようなマクロの記述になるでしょうか?

Excel2016です。
よろしくお願いいたします。

Aベストアンサー

すみません。体調を壊していて、細かい作業ができません。
うまくいくかは別として、当面の進捗状態をみるために、コードを挙げておきます。
この手の規模のものは、参照設定をしないと負担が大きいと思います。
以下に「ページ数」となっていますから、「1 to 5」の そこがページ数です。
小分けにしたほうが安全です。一気にしようとして失敗すると、せっかくの取得したものも失いかねません。
起動はMain()からです。

それから、BASEURL のGoogle URLの末尾は、?q= ダブルクォーテーションです。掲示板では文字が変わる可能性があります。


'//標準モジュール
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Dim objIE As SHDocVw.InternetExplorer '参照設定 Microsoft Internet Contorls
Dim oHTML As HTMLDocument '参照設定 Microsoft HTML Object Library
Sub Main()
 Dim c As Range
 Dim enSrTxt As String
 Dim counter As Long
 On Error GoTo ErrHandler
 Const BASEURL As String = "https://www.google.co.jp/search?q="
 With ActiveSheet
  Set objIE = Nothing
  For Each c In .Range("A1", .Cells(1, Columns.Count).End(xlToLeft))
   If c.Value <> "" Then
    If c.Value Like "*[ぁ-龠]*" Then
     enSrTxt = EnUtf8(c.Value)
    Else
     enSrTxt = c.Value
    End If
    Call getIE(BASEURL & enSrTxt)
    Application.Wait TimeSerial(0, 0, 10) '休み
    counter = counter + 1
   End If
  Next c
 End With
ErrHandler:
 If Err <> 0 Then
  MsgBox Err.Description 'エラー出力
 End If
End Sub

Sub getIE(ByVal strURL As String)
 Dim cnt As Long
 Dim cl As Object
 Dim c As Range
 Dim nm As Long
 Set oHTML = New HTMLDocument
 If objIE Is Nothing Then
  Set objIE = New SHDocVw.InternetExplorer
 End If

 Set c = Cells(2, Columns.Count).End(xlToLeft) '二行目で計る
 If c.Value <> "" Then nm = c.Column + 1 Else nm = c.Column

 With objIE
  .Visible = True
  .navigate strURL
  Do While .Busy Or .readyState <> 4: DoEvents: Loop
  Set oHTML = .document
 End With

 For cnt = 1 To 5 'ページ数
  Call outputLog(oHTML, nm)
  Set cl = objIE.document.getElementsByClassName("csb ch")
  cl(cnt).Click
  DoEvents
  Sleep 500
  Do While objIE.Busy Or objIE.readyState <> 4: DoEvents: Loop
  Set oHTML = objIE.document
 Next cnt
 Cells(1, nm).EntireColumn.AutoFit
 Application.ScreenUpdating = True

End Sub
Sub outputLog(oHTML As HTMLDocument, nm As Long)
 Dim buf As Variant
 Dim j As Long, i As Long, k As Long
 Dim gLinks As Object

 j = Cells(Rows.Count, nm).End(xlUp).Row + 1

 With oHTML
  Set gLinks = oHTML.getElementsByClassName("TbwUpd")
  If gLinks.Length > 0 Then
   For i = 0 To gLinks.Length - 1
    buf = gLinks(i).ParentNode.href
    If InStr(1, buf, "%") > k Then buf = DecodeUTF8(buf)
    Cells(j, nm).Value = buf
    j = j + 1

    buf = ""
   Next
  End If
 End With
End Sub


Public Function EnUtf8(ByRef strSource As String) As String
 'Encode
 Dim objSC As Object
 Set objSC = CreateObject("ScriptControl")
 objSC.Language = "Jscript"
 EnUtf8 = objSC.CodeObject.encodeURIComponent(strSource)
 Set objSC = Nothing
End Function

Function DecodeUTF8(ByVal strSearch As String)
 'Decord
 If strSearch = "" Then Exit Function
 With CreateObject("ScriptControl")
  .Language = "JScript"
  With .CodeObject
   DecodeUTF8 = .decodeURI(strSearch)
  End With
 End With
End Function

すみません。体調を壊していて、細かい作業ができません。
うまくいくかは別として、当面の進捗状態をみるために、コードを挙げておきます。
この手の規模のものは、参照設定をしないと負担が大きいと思います。
以下に「ページ数」となっていますから、「1 to 5」の そこがページ数です。
小分けにしたほうが安全です。一気にしようとして失敗すると、せっかくの取得したものも失いかねません。
起動はMain()からです。

それから、BASEURL のGoogle URLの末尾は、?q= ダブルクォーテーションです。掲示板では文...続きを読む

Qマクロ無しで時間自動で記入をしていきたい

すごく贅沢な話なのですが・・・
マクロを使わず、通常のエクセルで時間を手入力でなく何かしらしたら(例:「1」と入力)自動で別セルに現在時刻ほ記載してくれる

マクロだと下記のような内容でやってます(一部)
Range("H3:K33").Select
Selection.Copy
Sheets("結果").Select
Range("A4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

マクロを使わずやれる方法はないでしょうか・・・

Aベストアンサー

論より 証拠、

作ってみました。


式、
=TEXT(IF(ISBLANK(B1),IF(ISBLANK(A10),B10,TODAY()),"此処が 変わります。"),"rr/mm/dd hh:mm")

ファイル、
https://1drv.ms/x/s!AjviygfJDgV_3GnS4Ko-q3mWU9fP

尚、
ファイルは 1度、
ローカルに 別名保存して、
其の保存ファイルを 扱うように、
してくださいね、

別名保存でないと、
意味が 無いですよ。


さすれば、
閲覧も、編集も、
叶うものと 思いますよ。

QIF関数とMODで、例えば入れた数値の倍数の時に◯が表示される……という数式を作りましたが、1.1の

IF関数とMODで、例えば入れた数値の倍数の時に◯が表示される……という数式を作りましたが、1.1の時に本当だったら1.1、2.2、3.3、4.4、5.5、6.6、7.7……で◯になるはずなのですが、10以下の数値を入れてみると、3.3、5.5、6.6、7.7、9.9は◯の表示がでてきません。
1.1、2.2、4.4、8.8しか◯が出ません。
どうしてでしょうか?

Aベストアンサー

幼稚な言い方だけど、Excel(に限らないので、PC全般的なことと理解してネ)は“小数点の計算には弱い”と理解しておきませう。
理屈っぽい人はフドーショースーテン(浮動小数点)問題などど言い始めますが・・・
それはさておき、対策を教えます。カンタンなことで、小数点抜きの整数に換算して、Excel に計算させることです。
貴方が提示した式(実はナッチョランでしたが)、を
=IF(MOD($A2*10,B$1*10)=0,"◯","")
に変更するだけで解決します。ゴチャゴチャ考えずに先ずは実行してみること!
どうなりましたか?

Q日付の作成方法を教えて下さい。

縦カレンダーを作りたく、色々検索して月初日を作ることは出来ました。
そこから、+1してカレンダーを作りたいのですが上手く出来なかった為、質問させていただきました。


コード
Sub 日付作成()

Dim d As Date
d = Date ' 本日日付
Range("A2").Value = DateSerial(Year(d), Month(d), 1)

Dim tenkiws As Worksheet
Set tenkiws = Worksheets("転記先")

Dim i As Long
For i = 4 To 63 Step 2
tenkiws.Cells(i, 1) = tenkiws.Range("A2") + 1
Next i

End Sub

やりたいこととしては、一行飛ばしに日付を加算させていくなのですが、上のコードだと4行目だけ変わって後は変わりません。
どうすれば63行目まで変えることが出来るのでしょうか?
ご教授宜しくお願い致します。

縦カレンダーを作りたく、色々検索して月初日を作ることは出来ました。
そこから、+1してカレンダーを作りたいのですが上手く出来なかった為、質問させていただきました。


コード
Sub 日付作成()

Dim d As Date
d = Date ' 本日日付
Range("A2").Value = DateSerial(Year(d), Month(d), 1)

Dim tenkiws As Worksheet
Set tenkiws = Worksheets("転記先")

Dim i As Long
For i = 4 To 63 Step 2
tenkiws.Cells(i, 1) = tenkiws.Range("A2") + 1
N...続きを読む

Aベストアンサー

Sub 日付作成()

Dim d As Date
d = Date ' 本日日付
Range("A2").Value = DateSerial(Year(d), Month(d), 1)

Dim tenkiws As Worksheet
Set tenkiws = Worksheets("転記先")

Dim i As Long
For i = 4 To 63 Step 2
tenkiws.Cells(i, 1) = tenkiws.Range("A2") - 1 + i / 2
Next i

End Sub

Qどのようにマクロ を組み立てればよろしいでしょうか?今やってみているのですがなかなかできず困ってます

どのようにマクロ を組み立てればよろしいでしょうか?今やってみているのですがなかなかできず困ってます

Aベストアンサー

あぁ、
そうそう、
終了は、
フラグ管理に しておいて、
判定ルーチンで、
終了条件成立判定が 出たなら、
フラグで 結果を、
渡して、
シートの マクロで、
呼び出す、
シートマクロ機動禁止処理
&完了時処理の ルーチンすれば、
自ずと 終わるかな?

Qこのマクロ

(自分) マクロについて教えてください。エクセル2010です。(A) C6:T6に
84.69.62.59.58.53.52.50.49.48.47.46.41.40(ここの数字は8~18個

の数字が入り、9個の時とか12個の
時もあります。)
そのデータ(数字は同じではなくその行ごとによって違う。が28行目まで同一の単位で2行飛びであり)

同一シートにある(B) C32:T32に84.69.62.58.53.52.50.49(ここの数字は8個の数字だけ。)
そのデータ(数字は同じではなくその行ごとによって違う。が54行目まで同一の単位で2行飛び出あり)
(A)と(B)を比較して(B)には表示されていない(A)の抜けている数字(ここでは59.48.47.46.41.40)に
色を付ける(緑)のマクロを教えて頂きたいです。あと出来たら空白にする(59.48.47.46.41.40)のも教え
て頂きたいです。宜しくお願いします。



(答えてくれた人)
貴方の言う2行飛びとは、2行空けることではないのですか。
先頭が、6行目で2行あけていくと、最後は27行目になりますが。
Bのエリアも同様です。

それから、AとBで対応する行の比較でいいのですね。
6行目は32行目と比較、9行目は35行目と比較というように


(自分)
お急がしい所回答有り難うございます。6行目は32行目、8行目は34行目、10行目は36行目、12行目は38行目、14行目は40行目...28行目は54行目までという感じです。
すいません2行ではなく1行飛びでした。
AとBで対応する行の比較です。


と質問してマクロを教えてもらったのですが、

Sub Sample()
Dim i As Integer, j As Integer
Dim rng As Range
For i = 6 To 28 Step 2
Set rng = Range("C" & i + 26 & ":T" & i + 26)
For j = 3 To 20
If Application.CountIf(rng, Cells(i, j)) > 0 Then
Cells(i, j).Interior.ColorIndex = 4
End If
Next j
Next i
End Sub

同じ表があり、(X6:AO6、AS6:BJ6、BN6:CE6、CI6:CZ6、DD6:DU6、
DY6:EP6、ET6:FK6)
にも同じ事をしたいのですが、5行目のCとTの所をXとAOにしても動きませんというか、色がつきません。

マクロを教えてください。宜しくおねがいします。

(自分) マクロについて教えてください。エクセル2010です。(A) C6:T6に
84.69.62.59.58.53.52.50.49.48.47.46.41.40(ここの数字は8~18個

の数字が入り、9個の時とか12個の
時もあります。)
そのデータ(数字は同じではなくその行ごとによって違う。が28行目まで同一の単位で2行飛びであり)

同一シートにある(B) C32:T32に84.69.62.58.53.52.50.49(ここの数字は8個の数字だけ。)
そのデータ(数字は同じではなくその行ごとによって違う。が54行目まで同一の単位で2行飛び出あり)
(...続きを読む

Aベストアンサー

ソースをきっちりと読んでいませんが

> For j = 3 To 20

の部分、3→"C"、20→"T"に対応しているので、
この数値も変更する必要があると思います。
(”X"→24みたいに)

Q「最小化」したファイルが元のサイズに戻ってしまう。

よろしくお願いします。

Excel 2010におきまして、例えば「A」という名前のファイルを開いていて、そのファイルを閉じずに「最小化」して、別の「B」というファイルを開いた際、「A」のファイルが自動で「最小化」が解除されてしまいますが、それを自動にて解除されないように設定することはできますでしょうか?

教えて下さい。

Aベストアンサー

Aファイルの最小化でExcelそのものを最小化したのでしょうか?

この場合だと、Bファイルをエクスプローラなどから開くと。同じ
インスタンスで開くので、Aファイルを開いたExcelでファイルが
立ち上がるので、別インスタンスとしてのExcelを立ち上げてから
Bファイルを開くようにしないと、最小化したものも同じExcel上で
立ち上がるので、元のAファイルも戻ります。
https://www.atmarkit.co.jp/ait/articles/0708/10/news133.html
これはExcel2013以降でも基本的に同じ動作をします。
(No.1の回答者さんが書いているのは、このことを簡潔に回答)

別インスタンスで立ち上げる方法は幾つかあります。以下のサイト
での[送る]を使った方法が一番簡単ではないかと思うので、試して
みてはいかが。。
https://www.atmarkit.co.jp/ait/articles/0708/10/news133_2.html

他に、[ファイル名を指定して実行]でコマンドラインとして /x を
付け、別インスタンスでファイルを起動する方法などもあります。
https://support.office.com/ja-jp/article/Microsoft-Office-%E8%A3%BD%E5%93%81%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-079164cd-4ef5-4178-b235-441737deb3a6#ID0EAABAAA=Excel

Aファイルの最小化でExcelそのものを最小化したのでしょうか?

この場合だと、Bファイルをエクスプローラなどから開くと。同じ
インスタンスで開くので、Aファイルを開いたExcelでファイルが
立ち上がるので、別インスタンスとしてのExcelを立ち上げてから
Bファイルを開くようにしないと、最小化したものも同じExcel上で
立ち上がるので、元のAファイルも戻ります。
https://www.atmarkit.co.jp/ait/articles/0708/10/news133.html
これはExcel2013以降でも基本的に同じ動作をします。
(No.1の回答者さんが書い...続きを読む

Qエクセルについて。

次の数式を求める関数(下の方のプラン表)は、どんな数式を打てば良いのでしょうか?教えていただけると幸いです。

Aベストアンサー

単純な足し算ですよね。
添付画像のように作ったとして

[C8]=SUM($B$2,C$7,$B8)

これを[C8:F12]の範囲にコピーすればOK。

通常、数式のセルは、コピー貼り付けすると、移動先に応じてセルアドレスが変わってしまいますが、
「$」をつけることで、固定することができます。

上の式だと、どこに移動しても

$B$2 は B2 を参照するように固定される。

C$7 は 7行目 を参照するように固定される。
(式を下にコピーしても、7行目に固定される)

$B8 は B列 を参照するように固定される。
(式を右にコピーしても、B列に固定される)

ということになります。
$をつけて参照先を固定するのを「絶対参照」、
つけていない普通の場合は「相対参照」、
と言います。
より詳しいことは、このキーワードで検索して調べてみてください。

金額表示については、セルの書式から、
分類:通貨
記号:\
にしてあります。
実際のセルに「\」は入力されていません。

Qエクセルでセルのデータがカタカナかどうか調べたい

セルA1の内容が、全角カタカナか半角カタカナか知りたいです。

エクセル関数又はマクロコマンドがあるはずだと信じて探していますが、見つかりません。TYPE関数では、セルの内容が数値か文字列かを調べられますが、その文字列がカタカナか英数字かなどを調べられません。ご存知の方はお教えください。

Aベストアンサー

元の 文字列が、
セルA6に あるとして、
セル内が 全て、
全角片仮名かは、
=SUMPRODUCT((CODE(MID($A$6,COLUMN(OFFSET($A$1,0,0,1,LEN($A$6))),1))=ROW($A$9506:$A$9590))+0)=LEN($A$6)

半角片仮名かは、
=SUMPRODUCT((CODE(MID($A$6,COLUMN(OFFSET($A$1,0,0,1,LEN($A$6))),1))=ROW($A$177:$A$211))+0)=LEN(A6)

で 判りますよ。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング