Excel VBA質問箱 IV

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

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


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

【81402】Re:表を加工して別シートに転記したい
発言  マナ  - 20/7/21(火) 21:18 -

引用なし
パスワード
   ▼ありす さん:

>繰り返してn回転記するというのはわかるのですが、
>そこに、日付の操作と、品名の後ろにつける方法がわかりません。

わからないところは、こちらで考えますので
できるところだけでも自分で書いてみませんか。
・ツリー全体表示

【81401】表を加工して別シートに転記したい
質問  ありす  - 20/7/21(火) 15:50 -

引用なし
パスワード
   はじめまして。
過去ログを検索してみたものの、似てるのはあったけど自分で応用ができず投稿させていただきます。
無知ですみません。
今、手作業と関数を使ってやっている作業を自動でできたらいいな。と思って検索していました。

やりたいことは、以下です。
・sheet1にある表をsheet2に転記したい。
・sheet1に開始日と終了日の項目があるので、それをsheet2に転記するときに品名の後ろにくっつけたい

sheet1のデータ
セルD5からセルK5までは項目名が入っていて、
セルD6からセルK○行目までデータが入っています。
A列とB列に必要情報が色々書いてあって、その中に、開始日と終了日があります。
期間→B5 B6とB7の日付から何か月分か計算してある。
開始日→B6
終了日→B7
D5日付 E5発送1 F5発送2 G5発送コード1 H発送コード2 I5品名 J5金額 K5金額2

日付は開始から終了の各月の月末日付を入力
発送1、発送2、発送コード1、発送コード2、金額、金額2はそのまま転記
品名は、品名の後ろに('20/1月分)など日付と同じ月をカッコで追加。

Sheet1のデータ1行に対して、開始日(月)から終了日(月)までを繰り返して、
最終行まで転記したい。

sheet1のデータは、その時によって変動しデータ行数は固定ではありません。
(データの始まりは6行目で固定)
期間→B5 3か月
開始日→B6 2020/7/10
終了日→B7 2020/9/10
D     E    F   G  H  I    J  K
2020/7/10 東京都 ××区 001 123 りんご 100 100
2020/7/10 千葉県 △△市 002 456 みかん 200 0


sheet2に転記したとき(項目名が5行目にあるので、データ開始はD6から)
D     E    F   G  H  I          J  K
2020/7/31 東京都 ××区 001 123 りんご('20/7月分) 100 100
2020/8/31 東京都 ××区 001 123 りんご('20/8月分) 100 100
2020/9/30 東京都 ××区 001 123 りんご('20/9月分) 100 100
2020/7/31 千葉県 △△市 002 456 みかん('20/7月分) 200 0
2020/8/31 千葉県 △△市 002 456 みかん('20/8月分) 200 0
2020/9/30 千葉県 △△市 002 456 みかん('20/9月分) 200 0

繰り返してn回転記するというのはわかるのですが、
そこに、日付の操作と、品名の後ろにつける方法がわかりません。

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

【81400】Re:表の比較
発言  マナ  - 20/7/16(木) 21:05 -

引用なし
パスワード
   ▼T-K さん:

>配列を表に入れるこのプログラムは、教えていただいた
>ものです。私が作成したものではありません。

それは、承知しています。
dictionaryで何をしているか理解できてなさそうだったので
根のため確認しました。

>処理速度が遅いようであれば、現状と変わらないため参考までとさせていただきます。Matchで照合しているようですが、少しむずかしいです。
>とりあえず調べてみます。

処理速度は考えていません。
あくまで配列の勉強です。
↓こういうことでしたので。

>一番の理由は、配列を理解するため。

速度重視なら、dictionaryの使い方を変更し
配列から、一括で、sheet2に書き込むようにすると
少しは速くなるはずです。

ただし、トライするのは、もっと単純なケースでよいので
dictionaryと配列を使えるようになってからが良いと思います。
・ツリー全体表示

【81399】Re:表の比較
発言  T-K  - 20/7/15(水) 23:57 -

引用なし
パスワード
   配列を表に入れるこのプログラムは、教えていただいた
ものです。私が作成したものではありません。

出力用に既定の表があり、その表の行(商品データ)と列(日付)の&値をDictinaryのKeyとして
行と列の交差している値(注文数)とその値の入力されているアドレスをItemとして
Dictionaryに登録しているようです。
Hashテーブルという既定の機能を利用しているようですが、
アドレスを利用してどのようにコンピュータがそれを解釈しているかは
いまだにイメージできていません。そのようなものとおもっていまもつかっっています。
配列にはそのような機能はないようです。
プログラムを作成していただいて感謝しますが、
処理速度が遅いようであれば、現状と変わらないため参考までとさせていただきます。Matchで照合しているようですが、少しむずかしいです。
とりあえず調べてみます。
・ツリー全体表示

【81398】Re:表の比較
発言  マナ  - 20/7/15(水) 21:40 -

引用なし
パスワード
   ▼T-K さん:

処理速度には、期待しないでください。
あくまで、配列の勉強が目的です。

>一番の理由は、配列を理解するため。
・ツリー全体表示

【81397】Re:表の比較
発言  マナ  - 20/7/15(水) 21:04 -

引用なし
パスワード
   ▼T-K さん:

dictionaryについて質問してもよいですか。
なぜ、配列を登録しているのでしょう。
アドレスだけではだめなのでしょうか。

>fDic(com & dt) = VBA.Array(c.Value, c.Address(External:=True))
・ツリー全体表示

【81396】Re:表の比較
発言  マナ  - 20/7/15(水) 21:02 -

引用なし
パスワード
   ▼T-K さん:

無理矢理、配列を使ってみました。
たぶん、直接セルに数式を埋め込んで、
計算後に値に変換のほうがよいと思います。
色付けは、条件付き書式で対応してください。

Sub test()
  Dim tbl As Range
  Dim v
  Dim j As Long, k As Long
  Dim mX, mY

  Set tbl = Sheets("Sheet1").Range("A1").CurrentRegion
  
  With Sheets("Sheet2").Range("A1").CurrentRegion
    v = .Value
    For j = 2 To UBound(v, 1)
      For k = 3 To UBound(v, 2)
        mX = Application.Match(CLng(DateValue(v(1, k))), tbl.Rows(1), 0)
        mY = Application.Match(v(j, 1), tbl.Columns(1), 0)
        If IsNumeric(mX) * IsNumeric(mY) Then
          v(j, k) = Application.Index(tbl, mY, mX)
        End If
      Next
    Next
    .Value = v
  End With
 
End Sub
・ツリー全体表示

【81395】Re:表の比較
お礼  T-K  - 20/7/15(水) 17:45 -

引用なし
パスワード
   回答ありがとうございます。
配列では厳しそうですね
データを整理してみます、
・ツリー全体表示

【81394】Re:表の比較
回答  γ  - 20/7/15(水) 9:15 -

引用なし
パスワード
   さて、通常の配列は、整数のインデックスを持ちますが、
このケースでは、
 "ABC41621" ---> Array(100,"[Book1]Sheet1!$A$1")
 "ABC41622" ---> Array(200,"[Book1]Sheet1!$A$2")
 "ABC41623" ---> Array(300,"[Book1]Sheet1!$A$3")
という対応関係に関する情報が必要になります。

これを配列で管理しようとしたら、
 0番目のindexに Array(100,"[Book1]Sheet1!$A$1") を持たせ
 1番目のindexに Array(200,"[Book1]Sheet1!$A$2") を持たせ
 2番目のindexに Array(300,"[Book1]Sheet1!$A$3") を持たせ
といった一次元配列に納めるんですか?

すると、
"ABC41621"が何番目の要素になるかは、どうやって知るんですか?

喩えていえば、
今後、都道府県名は使わずに、0県,1県、2県とよぶことにする、
とルール化するようなものですな。現場は混乱するでしょう。

そのためには、別途
 "ABC41621" ---> 0
 "ABC41622" ---> 1
 "ABC41623" ---> 2
というような関係をどこかに持たせて、
ユーザー自身が逐一検索しなければなりません。
そうしたことを、Dictinaryは内部で効率的に行ってくれるのです。
(Hashテーブルという特別に工夫した仕組みを活用することで
 高速・効率的に行っているのが、Dictionaryというデータ構造なわけです。)

VBAの元になっているVB6という言語仕様には、Dictionaryを持っておらず、
外部のライブラリーに依存していますが、
気の利いたプログラム言語では、必ずといってよいほど言語仕様として
装備されている、とても一般的なデータ構造です。
(名称は色々で、Hashとか、DictionaryとかAssociated Arrayとか呼ばれます)

ですから、配列と同程度に普通に使えるものですし、
Dictinaryを使ったので重くなったということは無いはずです。


重くなってきたというのは、基本的にはデータ量が増えたことに起因しているのでしょう。
関係しなくなっている古いデータがあれば、それは別途のログに移すとか、
そうした方面の工夫の余地はありませんか?
・ツリー全体表示

【81393】Re:表の比較
発言  T-K  - 20/7/14(火) 19:54 -

引用なし
パスワード
   返信ありがとうございます。
一番の理由は、配列を理解するため。 
もう一つは、dictionaryのこのプラグラム
を仕事で今も使用しているが、
使用していくなかで、処理が重くなってきた為です。 
データを蓄積してけば、重くなるのは理解できます。
少しでも軽く処理が出来ないかと考えたときに、
配列はどうなのか、と考えました。
配列を登録してセルに出力はできますが、
dictionaryのように、keyに対してセルのアドレスに
値を出力する方法がわかりません。

お手数お掛けして申し訳ありません。
よろしくお願い致します。
・ツリー全体表示

【81392】Re:ハイパーリンクについて
お礼  bo25  - 20/7/14(火) 15:54 -

引用なし
パスワード
   ▼γ さん:
ありがとうございました。
・ツリー全体表示

【81391】Re:ハイパーリンクについて
発言  γ  - 20/7/14(火) 15:19 -

引用なし
パスワード
   関数ではないハイパーリンクについて調べてください。
何から何まで説明しきれませんよ。
・ツリー全体表示

【81390】Re:ハイパーリンクについて
質問  bo25  - 20/7/14(火) 11:30 -

引用なし
パスワード
   ▼γ さん:
ご回答ありがとうございました。
hyperlink関数では対応できないのですね。。。

再度質問させていただいてもよろしいでしょうか。

ご回答で、hyperlink関数を使わないものに変更してみては?
とのことですが、具体的にどの関数を使用すればよいでしょうか。


現在作成中のエクセルですが、

sheet1には検索値があり、vba登録したいシートです。
sheet2にwebページURLを含めた一覧表があります。


したいことは、

vbaボタンを押すと、sheet1の検索値に一致したsheet2のURLのページを表示することです。

(現在は、最初の質問のとおり、INDEX+MATCH関数で抽出し、HYPERLINK関数で引用していました)

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

【81389】Re:ハイパーリンクについて
回答  γ  - 20/7/14(火) 5:54 -

引用なし
パスワード
   いわゆるハイパーリンクには2種類ありますね。
・HYPERLINK関数によるもの
・HYPERLINK関数によらないもの(本来のハイパーリンク?)

セルのhyperlinkプロパティで管理されるものは、
上記の後者のもの(関数によらないもの)に限定されます。
ですから、エラーになりますね。
こればかりは仕様なので、致し方ないです。
争っても仕方がありません。
HYPERLINK関数を使わないものに変更してみては?


(なお、今回の質問に直接関係しませんが、
FollowHyperlinkイベントが、HYPERLINK関数によるものでは起きないことも、
重要な違いのひとつです。)
・ツリー全体表示

【81388】Re:表の比較
発言  γ  - 20/7/14(火) 5:43 -

引用なし
パスワード
   7年以上前のものですね。懐かしい。

さて、
Dictionaryを使わず、配列で実現できないか、
と言う質問に至った経緯を、逆に、もう少し教えていただきたいですね。
・ツリー全体表示

【81387】ハイパーリンクについて
質問  bo25  - 20/7/14(火) 1:54 -

引用なし
パスワード
   はじめまして。初質問です。

エクセルシートからウェブHPに飛ぶvbaを作成中です。

作成したvba
Range("AZ8").Hyperlinks(1).follow NewWindow:=True

なお、Range("AZ8")には、=HYPERLINK(INDEX+MATCH)関数を入力しており、他シートの一覧表から参照するようにしています。

このvbaを起動したとき、
「実行エラー9 インデックスが有効範囲にありません」
となります。

やはり、参照URLは直打ちでないといけないのでしょうか?

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

【81386】Re:表の比較
質問  T-K  - 20/7/13(月) 23:33 -

引用なし
パスワード
   以前この題目で問い合わせした、T-Kです。
Dictionaryにて値をKeyにして重複のない値をエクセルへ出力処理するやり方を
教えていただきました。ありがとうございました。

またおしえていただきたいのは、この内容の処理を配列でも
表現が可能なのでしょうか?

セルの値を配列に格納->それを加工してシートに出力という流れだと思いますが、
Dictionaryのように文字をKeyとできないこと 重複していても格納されてしまうこと等考えると、Dictionaryのほうが使い勝手はいいように思いますが、
もしその点で分かる方いらしたら教えてください。
・ツリー全体表示

【81385】Re:名前空間のあるxmlデータの抽出
お礼  Bernoulli  - 20/7/13(月) 17:31 -

引用なし
パスワード
   > Y様
固有の情報を投稿してしまいまして、失礼しました。
この件につきましては、当方で調査して参ります。ありがとうございました。
・ツリー全体表示

【81384】Re:名前空間のあるxmlデータの抽出
回答  γ  - 20/7/13(月) 17:14 -

引用なし
パスワード
   こういうドメイン知識を、ExcelVBAの質問掲示板にあげるのはいかがなものかと思います。
ご自分で調べるべきです。

ちなみに、ネット検索したところ、
下記のドキュメントを読むとよいのではないかと思います。
(1)
気象庁XMLとは
ht tps://aitc.jp/events/20130711-Kansai/20130711_111.pdf
(2)
気象庁防災情報XMLフォーマット(本文)[PDF形式:223KB](平成28年3月31日一部修正)
ht tp://xml.kishou.go.jp/jmaxml_20160331_format_v1_2.pdf
(↑そのままだとエラーになるので、あえて半角スペースを入れています。)


動作するものが得られましたが、あえて書きません。
・ツリー全体表示

【81383】Re:簡単なマクロなんですが・・・動きま...
発言  poor  - 20/7/12(日) 14:21 -

引用なし
パスワード
   マナさん

ご返信ありがとうございます。
今すぐ確認できないのですが、後ほど確認してみます。
ありがとうございます。
・ツリー全体表示

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