Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


327 / 3841 ページ ←次へ | 前へ→

【75885】Re:VBA CountIfのRangeのセル範囲設定に...
発言  kanabun  - 14/7/27(日) 12:48 -

引用なし
パスワード
   ▼のら さん:

>これだと
>Sheet1.Cells(5, MaxCol + 1) = WorksheetFunction.CountIf(Range(Sheet1.Cells(5, MaxCol - 1),Sheet1.Cells(5,MaxCol - 10)), "欠")
>がエラーになりました。
>
>Sheet1.Cells(5, MaxCol + 1) = WorksheetFunction.CountIf(Range("Sheet1.Cells(5, MaxCol - 1),Sheet1.Cells(5,MaxCol - 10)"), "欠")
>でもエラーが出ました。
>
>Rangeの部分をRange("A5:AZ5")のようにするとカウントしてくれます。
>
>日簿が増えていくため,Range()の部分が変数になるので
>Cells()で表せないかと苦慮しています。
>
>セル範囲の設定Range()をCells()を使ってあらわすにはどうすればよいのでしょうか?

いちばん最初の構文↓
> Sheet1.Cells(5, MaxCol + 1) = WorksheetFunction.CountIf( _
> Range(Sheet1.Cells(5, MaxCol - 1), Sheet1.Cells(5, MaxCol - 10)), "欠")
は、
どういうエラーになるのでしょう?
こちらでは とくにエラーにはなりませんが。

Cells()を使うなら、Resizeプロパティと合わせて、こうですかね?

Sheet1.Cells(5, MaxCol + 1).Value = WorksheetFunction.CountIf( _
  Sheet1.Cells(5, MaxCol - 10).Resize(, 10), "欠")
・ツリー全体表示

【75884】Re:IF関数なのか他の方法があるのかわか...
質問  素人です  - 14/7/27(日) 11:59 -

引用なし
パスワード
   γさん、当方混乱しててすいません。
一致してないリストを作りたいのです。
すなわち2)3)6)8)の人物のリストが最終的に
欲しいのですが、そのために一致しているリストを
排除するための質問でした。

本当に混乱してて申し訳ありません。

γさん含め有志の方々よろしくお願い致します。


▼γ さん:
>一般機能の素人ですので、割り引いて見て下さい。
>
>・最初の5列を指定して、ソートを掛けます。
>・判定列を作って、そこに
> =OR(AND(A3=A2,B3=B2,C3=C2,D3=D2,E3=E2),AND(A3=A4,B3=B4,C3=C4,D3=D4,E3=E4))
> のような計算式を入れます。
>・オートフィルタを使って、判定列がTrueのものだけ抽出します。
>
>マクロがお望みなら、マクロ記録が参考になるでしょう。 
>(最初の順番を保存したければ、最初に追加列に連番を振っておき、
> 最後にこれでもとに戻します。)
・ツリー全体表示

【75883】Re:IF関数なのか他の方法があるのかわか...
質問  素人です  - 14/7/27(日) 11:43 -

引用なし
パスワード
   γさん早速の御返信ありがとうございます。

当方のエクセルは2003なので五列を指定できるのでしょうか?
いわゆるソートのくくりでは3つまでしか指定できないような気がしますが...
(素人なので他の方法があるのかもしれませんが...)

判定列を作って、そこに
 =OR(AND(A3=A2,B3=B2,C3=C2,D3=D2,E3=E2),AND(A3=A4,B3=B4,C3=C4,D3=D4,E3=E4))
 のような計算式を入れます

このくだりはいわゆる関数の部分に入力するとの意味で
良いのでしょうか?

どうぞよろしくお願い致します。


▼γ さん:
>一般機能の素人ですので、割り引いて見て下さい。
>
>・最初の5列を指定して、ソートを掛けます。
>・判定列を作って、そこに
> =OR(AND(A3=A2,B3=B2,C3=C2,D3=D2,E3=E2),AND(A3=A4,B3=B4,C3=C4,D3=D4,E3=E4))
> のような計算式を入れます。
>・オートフィルタを使って、判定列がTrueのものだけ抽出します。
>
>マクロがお望みなら、マクロ記録が参考になるでしょう。 
>(最初の順番を保存したければ、最初に追加列に連番を振っておき、
> 最後にこれでもとに戻します。)
・ツリー全体表示

【75882】VBA CountIfのRangeのセル範囲設定につ...
質問  のら  - 14/7/27(日) 11:23 -

引用なし
パスワード
   出席簿を作っています。
毎日の様式(日簿)をVBAで増やしていき,
週末(5日ごと)に週計の様式を出すよう考えました。
様式を作っていくところまでは何とかできているのですが,

一週間の欠席日数などを集計するVBAで躓いています。

下記のようなものをつくりました。

Sub 集計追加()

MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column


If Sheet1.Cells(2, MaxCol) = "週計" Then
  Sheet1.Cells(4, MaxCol) = ""
  Sheet1.Cells(4, MaxCol + 8) = "欠課"
  Sheet1.Cells(4, MaxCol + 9) = ""
End If
 
Sheet1.Cells(5, MaxCol + 1) = WorksheetFunction.CountIf(Range(Sheet1.Cells(5, MaxCol - 1),Sheet1.Cells(5,MaxCol - 10)), "欠")


End Sub

これだと
Sheet1.Cells(5, MaxCol + 1) = WorksheetFunction.CountIf(Range(Sheet1.Cells(5, MaxCol - 1),Sheet1.Cells(5,MaxCol - 10)), "欠")
がエラーになりました。

Sheet1.Cells(5, MaxCol + 1) = WorksheetFunction.CountIf(Range("Sheet1.Cells(5, MaxCol - 1),Sheet1.Cells(5,MaxCol - 10)"), "欠")
でもエラーが出ました。

Rangeの部分をRange("A5:AZ5")のようにするとカウントしてくれます。

日簿が増えていくため,Range()の部分が変数になるので
Cells()で表せないかと苦慮しています。

セル範囲の設定Range()をCells()を使ってあらわすにはどうすればよいのでしょうか?
または,ほかに良い方法があったら教えてください。
よろしくお願いします。
・ツリー全体表示

【75881】Re:IF関数なのか他の方法があるのかわか...
発言  γ  - 14/7/27(日) 10:45 -

引用なし
パスワード
   一般機能の素人ですので、割り引いて見て下さい。

・最初の5列を指定して、ソートを掛けます。
・判定列を作って、そこに
 =OR(AND(A3=A2,B3=B2,C3=C2,D3=D2,E3=E2),AND(A3=A4,B3=B4,C3=C4,D3=D4,E3=E4))
 のような計算式を入れます。
・オートフィルタを使って、判定列がTrueのものだけ抽出します。

マクロがお望みなら、マクロ記録が参考になるでしょう。 
(最初の順番を保存したければ、最初に追加列に連番を振っておき、
 最後にこれでもとに戻します。)
・ツリー全体表示

【75880】IF関数なのか他の方法があるのかわかりま...
質問  素人です  - 14/7/27(日) 10:07 -

引用なし
パスワード
   下記のようなエクセルの表があります。

  1    2    3   4    5     6    7  
  
1)山田 太郎 50歳 東京 品川  車無し 既婚 

2)山田 太郎 45歳 東京 品川  車所有 既婚

3)山田 完治 50歳 東京 品川  車所有 未婚

4)山田 太郎 50歳 東京 品川  車所有 既婚

5)黒木 花子 50歳 青森 弘前  車所有 既婚

6)黒木 小雪 50歳 東京 品川  車所有 既婚

7)黒木 花子 50歳 青森 弘前  車所有 未婚

8)黒木 花子 23歳 東京 品川  車所有 既婚


下記のように
1,2,3,4,5だけが一致してれば(該当者のみ)
上下二列で表示するようにしたいのです。


1)山田 太郎 50歳 東京 品川  車無し 既婚
4)山田 太郎 50歳 東京 品川  車所有 既婚
5)黒木 花子 50歳 青森 弘前  車所有 既婚
7)黒木 花子 50歳 青森 弘前  車所有 未婚


以上よろしくお願い致します。
・ツリー全体表示

【75879】ありがとうございました。
お礼  konkon  - 14/7/27(日) 7:58 -

引用なし
パスワード
   ▼γ さん:

こんにちは。

お礼が遅くなりました。

丁寧な解説をありがとうございました。

OCRの導入を検討してみます。

またよろしくお願いいたします。
・ツリー全体表示

【75878】Re:数字と文字列の比較
発言  独覚  - 14/7/25(金) 16:26 -

引用なし
パスワード
   ▼田中 さん:
とりあえずセルに値が入力されている場合で2007以降の場合とします。

「データ」-「区切り位置」なり入力時に「'」を付けるなりあらかじめセルの書式設定の
「表示形式」で「文字列」にしておくなどですべて文字列としておいて「ホーム」-「編集」
-「並べ替えとフィルター」で「ユーザー設定の並べ替え」として「並べ替えの前に」ダイアログが
表示されたら「数値とテキスト形式の数値を分けて並べ替えを行う」にチェックを入れて
並べ替えてはどうでしょうか?

上記では問題ある場合はもう少し何をどうしたいかを詳しく説明してくれませんか?
・ツリー全体表示

【75877】数字と文字列の比較
質問  田中  - 14/7/25(金) 15:49 -

引用なし
パスワード
   数字と文字列を比較した場合、数字の方が大きいと判断されてしまいますが、これを逆にすることは可能ですか??

例として

1、2、1a、2aとうい4つの文字を比較した場合

大きい順に
2a、2、1a、1となるように比較したしです。
・ツリー全体表示

【75876】Re:差込メールでの添付ファイルの追加
お礼  秋田猫  - 14/7/20(日) 20:45 -

引用なし
パスワード
   γ さんさん
ありがとうございます。
大変助かりました。
また、返事が遅くなり
申し訳ないです。
おかげさまでうまく処理ができました。
大変助かりました。ありがとうございます。
また、いろいろ方法があるということがわかり
その他なにかでまた使ってみます。いろいろまた聞くかもしれませんが
何卒よろしくお願いいたします。

▼γ さん:
>個人意見であるとして、なにか信用されていないようなので、補足します。
>
>mailto: の仕様を定めたRFCでは、添付ファイルは規定していません。
>(「mailto: RFC」でネット検索してみてください)
>ですから、添付ファイルはもともとmailto:で使えるものになっていないのです。
>
>ただ、それをサービス的に実装することが禁止されているわけではないので、
>ものによって実現されている可能性もあります。少ないと思いますが。
>しかし、少なくとも、あなたのお使いのものはそれに対応していないようですね。
>(「mailto: 添付ファイル」でネット検索してみてください。同様の議論があるでしょう)
>
>ですから、mailtoを使わない別の方法を採用するのがよろしいでしょう。
・ツリー全体表示

【75875】Re:スキャンPDFの表(画像)をエクセル表...
発言  γ  - 14/7/20(日) 13:20 -

引用なし
パスワード
   参考までに。

画像からテキストを取り出すソフトはOCRソフトなどと呼ばれるようです。
有償ソフトがいくつも販売されています。
Acrobatもそうした機能を備えています。
もちろんこれらも完全ではありません。
極端な話だと、手書き文字の解析はやはり限界はありますし、
印刷物をスキャンしたものでも、文字化けすることもありえます。

そうした性格のものですから、こうした掲示板でやりとりできるコードで
素手で簡単に実現できるようなものではありません。
・ツリー全体表示

【75874】Re:Range object をFunctionに引渡す処理...
お礼  Aoba  - 14/7/20(日) 11:48 -

引用なし
パスワード
   ▼マナ さん:
ご丁寧なアドバイス有難うございます
今回はE列のみでしたが他の列がある場合
についてもトライしてみます
また、アドバイスお願いいたします
・ツリー全体表示

【75873】Re:Range object をFunctionに引渡す処理...
発言  マナ  - 14/7/20(日) 10:13 -

引用なし
パスワード
   ついでに、質問の件と違うところについて。

Rngは"Sheet1"のE列ですよね
つまり、Rngは、shtとRetuに関する情報を持っているので

>Function Comb(sht As Worksheet, Rng As Range, Retu As Integer)

は、

Function Comb(Rng As Range)

でも大丈夫なはず。
修正してみました。例えば、こんな感じで。

Function Comb(Rng As Range)
  Dim jyufuku As Integer
  Dim i As Integer
   
  For i = Rng.Count To 2 Step -1
    '2020についてはダブリの心配なし?
    jyufuku = WorksheetFunction.CountIf(Rng, Rng(i).Value)
    If jyufuku > 1 Then
      Rng(i).Delete Shift:=xlUp
    End If
  Next

End Function


そうすると、Sub Comb入力()の方は、
これだけでもよい気がします。

Sub Comb入力()
  Dim Rng As Range
  Const Retu = "E"

  With Workbooks("Bookname.xls").Worksheets("Sheet1")
    Set Rng = .Range(.Cells(4, Retu), .Cells(65536, Retu).End(xlUp))
  End With
  Rng(Rng.Count + 1).Value = 2020
  Comb Rng

End Sub

で、こうすると、Rngにセットする際に、シート指定しているだけですが、
あとは、すべてRngを使っているので、どのシートがactiveかを気にする必要もなくなります。
・ツリー全体表示

【75872】Re:Range object をFunctionに引渡す処理...
発言  マナ  - 14/7/20(日) 10:08 -

引用なし
パスワード
   ▼Aoba さん: 
>2)sht をアクティブにしないで、
>  'sht.Activate
>    Set Rng = sht.Range("E4", sht.Range("E65536").End(xlUp))
>   にしましたらRngが引渡されていませんでした。

sht をアクティブにしない場合は、
すべてのrangeオブジェクトについてシート指定することが必要です。
そんな面倒なと思うかもしれませんが、
今回の場合は、おそらく "Sheet1"のみの操作なので問題が少ないですが、
複数シートを扱うようなマクロだと困ることがでてくるでしょう。

なので、アクティブにしない方法も、理解することをお勧めします。
・ツリー全体表示

【75871】Re:Range object をFunctionに引渡す処理...
お礼  Aoba  - 14/7/20(日) 9:51 -

引用なし
パスワード
   ▼kanabun さん マナさん:
お手数をお掛けしました。有難うございました

1)sht をアクティブにしてから、
 Set Rng = Range("E4", Range("E65536").End(xlUp))
  にしましたら上手くいきました。
 
2)sht をアクティブにしないで、
  'sht.Activate
   Set Rng = sht.Range("E4", sht.Range("E65536").End(xlUp))
   にしましたらRngが引渡されていませんでした。

  取敢えず今のところこれで解決しました
  2)については再度調べてみます
  わからないときはまたお願いいたします
・ツリー全体表示

【75870】Re:スキャンPDFの表(画像)をエクセル表...
発言  konkon  - 14/7/20(日) 7:33 -

引用なし
パスワード
   こんにちは。

早速の回答ありがとうございます。

>その前に、そのコードは何をしているのか理解されていますか?
⇒理解していませんでした。

ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=10123;id=excel

この質問者さんはPDFデータをExcelシートに書式付きテキストでコピペしたい(本来はPDFデータをエクセルデータとしたい)との希望をもっていて、keinさんはコピペの部分を自動化するコードを提供されていたんですね。

自分は、PDFデータをテキスト化してコピペするコードかと思っていました。(T_T)

sendkeysなど理解していない部分に気をとられてしまって、都合よく解釈していました。
・ツリー全体表示

【75869】Re:スキャンPDFの表(画像)をエクセル表...
発言  γ  - 14/7/19(土) 23:33 -

引用なし
パスワード
   > 自分のPCでは、エクセル→PDF化したものkeinさんのコードでためしてみたのですが、
> 「SendKeysでキーを送って〜」の部分でつまづいています。
> この部分でアドバイスがいただけたら助かります。
どの行でエラーになって、何というメッセージかを書いてもらわないといけませんが、
その前に、そのコードは何をしているのか理解されていますか?

Ctrl+ A ですべてを選択し、
それをコピーして、
それをワークシートに(文字列の変換は若干ありますが)貼り付けているものですよね。

まず、マクロの前に、手作業でそれがうまくいくかどうか確認していますか?
それが先決です。
それができないなら、そのマクロには期待ができません。
画像からテキストが認識できるかどうかがポイントです。
・ツリー全体表示

【75868】Re:スキャンPDFの表(画像)をエクセル表...
発言  konkon  - 14/7/19(土) 22:12 -

引用なし
パスワード
   γ さん

回答ありがとうございました。

初めて投稿したのですが、URLを載せようとしたところ、
エラーが出てしまい、どうしても乗せられなかったので記載しませんでした。すみません。

元々はエクセル→印刷→スキャンでPDF化だったので応用可能かと思ってためしてみました。

自分のPCでは、エクセル→PDF化したものkeinさんのコードでためしてみたのですが、「SendKeysでキーを送って〜」の部分でつまづいています。

この部分でアドバイスがいただけたら助かります。

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


▼γ さん:
>あなたが言及されているのは、↓ですね。
>【10123】PDFをExcelに戻す方法 
>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=10123;id=excel
>(参照するならurlを明記してください。)
>
>そのスレッドの話は、
>もともとがExcelブックだったものをPDF化したものです。
>今回のは紙を画像としてスキャンした物ですから、精度がもともと落ちています。
>たぶん、Readerだけではどうにもなりませんし、
>VBAだけで画像の文字判定するのも不可能に近いと思います。
>
>仕事で必要な物ですから、Acrobatを入手するなり、投資をすべきです。
・ツリー全体表示

【75867】Re:Range object をFunctionに引渡す処理...
質問  kanabun  - 14/7/19(土) 20:31 -

引用なし
パスワード
   よこから 失礼します。
以下は、マナ さんがすでにおっしゃってることですが


---------
▼Aoba さん:
> sht.Activate をしないとゆうことでしょうか
> これではどのSheetがActiveになっているかどうか
> 不明でうまくいきません

それはエクセルにとっても同じです。

>  Set sht = Workbooks("Bookname.xls").Worksheets("Sheet1")
>  Set Rng = Range("E4", Range("E65536").End(xlUp))
>  sht.Activate

この1行目は shtという変数に あるブック内の"Sheet1"という名のシートを
指定していますから、shtがどのBookのシートか 明示されています。

ところが、2行目は
> Range("E4", Range("E65536").End(xlUp))
となっていて、どのシートのRange("E4") か どのシートの Range("E65536")
か? 明示されてません。
シートが明示されてないと、エクセルは ActiveSheet が省略されているのだと
と解釈します。

なので、
>  Set Rng = Range("E4", Range("E65536").End(xlUp))
は、
そのときアクティブになっているシートが
Workbooks("Bookname.xls").Worksheets("Sheet1")
すなわち sht でなかったら、Rngは 別のシートの
Range("E4", Range("E65536").End(xlUp))
がセットされていることになります。

[E4]セルというのは どのシートにもあるセルの名前なので、
仮にいま アクティブなシートが sht でなくても、このコードは
"エラーになってくれません"。
なので、ご質問のようなバグ状況が発生するのです。
あなたは shtをアクティブにしたつもりでも、それは Rngをセットしてあと
のことなので、Rngの親シートが sht であることは保障されていないのです!

2行目で sht の E列範囲を 変数Rng にセットしたいのなら、

(sht をアクティブにしてから、
 Set Rng = Range("E4", Range("E65536").End(xlUp)) 
とする方法もあるにはありますが...)

sht をアクティブにしなくても、

 Set Rng = sht.Range("E4", sht.Range("E65536").End(xlUp))

とシートを明示しておけば、済むことなのです。
・ツリー全体表示

【75866】Re:スキャンPDFの表(画像)をエクセル表...
発言  γ  - 14/7/19(土) 16:31 -

引用なし
パスワード
   あなたが言及されているのは、↓ですね。
【10123】PDFをExcelに戻す方法 
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=10123;id=excel
(参照するならurlを明記してください。)

そのスレッドの話は、
もともとがExcelブックだったものをPDF化したものです。
今回のは紙を画像としてスキャンした物ですから、精度がもともと落ちています。
たぶん、Readerだけではどうにもなりませんし、
VBAだけで画像の文字判定するのも不可能に近いと思います。

仕事で必要な物ですから、Acrobatを入手するなり、投資をすべきです。
・ツリー全体表示

327 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free