Excel総合相談所 126 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
全部のセルにVLOOKUPの式を入れるということでしょうか? こちらの理解が及んでいないのだと思いますが、行数を動的にしなければならず、全部のセルに数式を入れる〜という場合の対処法がよくわかりません >>698 うーん・・・説明がめんどくさくなってきた、スマン とりあえずまぁ、正解は無数にある 結果として早く正確に動けばいいので、手探りでいいから一度作って見ると良い 今まで10分かかる仕事が30秒になれば御の字だろう これを20秒とか5秒とかまで切り詰める必要はないと思う。俺はやるけどね vba高速化のセット置いとくんで、できる方法で頑張ってみ http://15g.jp/post-314/ >>696 Range("A1").Resize(n).Formula= とかさ もっとわかるようになれば>>697 なんだけど >>700 そうですか、すみませんでした… 何度も回答いただいてありがとうございました それこそ現在30秒ほどなのですが、これが最良とは思わないので、更に高速化させたいとテコ入れしているところです リンク先読んでみます、ありがとうございます Excelスレでfoo使ってる奴にイラッとくるんだけど俺だけか >>703 ,704 testやa、exampleよりもよっぽど打ちやすいし早いし考えなくて良いし、何があかんのかさっぱり分からん 【1 OSの種類 .】 Windows2000 【2 Excelのバージョン 】 Excel97 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 否 =if(and(A3="",A4="",A5="",…,A22="",B3="",B4="",B5="",…,B22=""),"入力が一切ありません","OK") (「…」はAやBの6〜21です) というチェック用のifを簡単な式にする方法は無いでしょうか? 関数でand(XXXX(A3:A22)="",XXXX(B3:B22))や、XXXX(A3:A22,B3:B22)=""的に纏められると嬉しいのですが >>707 isnullとかisナンチャラとか、、、 >>707 =IF(SUMPRODUCT((A3:B22<>"")*1)=0,"入力が一切ありません","OK") 気になっちゃったから色々テスト(10万セルにvlookup相当の結果を入れるコードを計測)してみたら意外な結果だった dictionary > セル範囲に一括で数式 >>> vba内でifとloop > 数式を入れたセルをオートフィル >>>>> vba内でworksheetfunction もちろんセルへのアクセス回数は最小限にしたりしてどのパターンも最適になるように頑張った結果がこれ セルにformulaを放り込むのも意外といけると思った 具体的に秒で示してくれると嬉しく存じアゲ くくく じゃイマイチ伝わらん >>687 ありがとうございました。 試してみたところ件名や本文の半角スペースより後ろの部分が表示されるようなりました。 中国語が文字化けするの自分もggrksしてみましたがこれではないでしょうか。 https://oshiete.goo.ne.jp/qa/5977178.html ここの下記の部分が文字化けを防ぐ対策ではないかと思うのですが組み込むことできますでしょうか。 If Flg Then 'thunderbirdだと文字化けしたのでUTFエンコード With CreateObject("ScriptControl") .Language = "JScript" Arg = .CodeObject.encodeURI(Arg) End With Else '簡易的にSJISエンコード b = StrConv(Arg, vbFromUnicode) Arg = "" For i = 0 To UBound(b) Arg = Arg & "%" & Right$("0" & Hex$(b(i)), 2) Next End If >>715 687じゃないし試してもないけど そこに貼ったコードは前半は687の方法、 後半のsjisはそもそもsjisに簡体字がないんだから問題外だとおもうんだよなあ >>715 どうも Beckyちゃんて BOM付けないとダメみたいね これでどうでしょうか?(本文だけで Subjectは無理です) Win10+Excel2016+Becky2.73 で確認したら OKだった これで無理ならどうにも ならんかもね >>687 のコードを修正 "&body=" & URLEncode(Range("B7").Value) ↓ "&body=%FF%FE" & URLEncode(Range("B7").Value) に修正 ※Beckyちゃんの言語設定で "送信メールは全てUTF-8(多言語混在可)で扱う" をチェック ON してください(しないと文字化けします) PS. BOMのエンディアンは適当です(どっちでもBeckyちゃんはOKだったので) 【1 OSの種類 .】 Windows2000 【2 Excelのバージョン 】 2010 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 否 A列に人名が並んでいます(重複あり) ここから名簿を作ろうと思います。 A列の名前データは定期的に変わります。 元データの総数は1万〜2万件で名簿リストは想定500〜1,000人です。 B列には初登場となる名前のインデックス用の番号を1、2、3…と振り、 最終的には別シートでindex matchで空白行を詰めた名簿にする予定です。 他のワークシートとのデータ連携の兼ね合いもあるためピボットではなく関数で自動化できないでしょうか。 >>714 聞いてくれて良かったわ 結果を入れる行数を変えてやってみたら 行数によってだいぶ違う傾向が出た 左から順に100行、1000行、10000行、100000行、1000000行 vlookupの第2引数部分の大きさは全て50×2、最後は全て値にして終わらしてる オートフィル 0.0546875秒 0.078125秒 0.21875秒 1.984375秒 29.92969秒 数式一括 0.03125秒 0.046875秒 0.203125秒 1.6875秒 26.14063秒 WorksheetFunction 0.015625秒 0.0390625秒 0.28125秒 2.773438秒 27.75781秒 Dictionary 0.0234375秒 0.0390625秒 0.171875秒 1.625秒 16.09375秒 loop探索 0.015625秒 0.03125秒 0.203125秒 1.96875秒 19.19531秒 >>718 名簿はA2から始めるとして B2=IF(COUNTIF(A:A,A2)=1,MAX($B$1:B1)+1,"") 下にお^ーとフィル 720がやりたいのはB2に =IF(COUNTIF($A$2:A2,A2)=1,MAX($B$1:B1)+1,"") じゃね? 定期的って頻度が分らんけど 別シートにコピーして "重複の削除"じゃダメなん だろうか? 2ちゃんだし仕方ないけど、説明めんどくさいと言われたネタを元に時間計測をそこまで詳細にされるという… 人のふんどし、ってのでもないけど、なんとも言えない感じだ 要はvlookupのFor nextなんざありふれてて目もくれないってことだ… >>723 できました。ありがとうございます。 >>724 一回一回やるその作業が手間なので自動化したかったんですよ >>725 むしろワークシート関数も結構使えるってことがわかって良かった 数式一括のやつはこんなコードで計測したけど 範囲が広くなったときに時間が延びてるのは主に.Value = .Value のとこっぽいから そこを割り引けば俺様愛用のDictionaryにほとんど引けをとってない 状況に応じてってことだな Dim t As Single Const endRow As Long = 1000000 t = Timer Range("B1").Resize(endRow).Formula = "=VLOOKUP(A1,$G$1:$H$50,2,FALSE)" Range("B1").Resize(endRow).Value = Range("B1").Resize(endRow).Value Debug.Print "数式一括", (Timer - t) & "秒" 画面の書き換えと再計算を止めればもっと速くなりそう >>728 はいよ再計算と描画の抑止と再開で挟んで1000000行の奴で2回やった オートフィル 21.25977秒 17.83789秒 数式一括 42.61133秒 57.04297秒 WorksheetFunction 26.33594秒 28.00977秒 Dictionary 14.58789秒 16.20313秒 loop探索 17.76563秒 19.36523秒 下3つはそもそも再計算関係ないし値も100万セルにまとめて出力してるから 719の時とほとんど変わらない 上2つは逆に値にする前に再計算させないと意味がないわけだけど (初心者の頃これでたまに失敗してた) 1番目のが大幅短縮したのはは描画停止の効果がでかいんだと思う 2番目のやつはいきなり計算させられて驚いた感じなのかな >>717 ありがとうございます。 中国語の本文だけでなく件名も文字化けしなくなりました。 件名の部分は変更されてないようですので 件名が文字化けしたのは勘違いだったかもしれません。 BOMなんてどっちでもいいと思ってたけど やっぱ付けるか付けないかの差があるんだな 横から見てて勉強になった VBA 可(というか望ましい) excel2010 要素aの番号と要素bの番号が対応しているとき、 要素bの番号だけ変わった際に、元もと対応していた要素aの番号を引っ張ってくるにはどうすればいいんでしょう a1=1 b1=5 a2=2 b2=10 a3=3 b3=6 で、bが変わって b1=6 b2=5 b3=10 となったとき、aの配列を並び替えたいんです やりたい事がいまいちわからんのだが 元々の対応を どっかに対応表として保存しとく(例えば別シートとか)ってのが定番だと思うが それじゃダメなん? >>739 VLOOKUP関数だけで出来るよ Sheet2に対応表作成 a1=1 b1=5 a2=2 b2=10 a3=3 b3=6 D1:=A1 下にコピー Sheet1 A1:=VLOOKUP(B1,Sheet2!$B$1:$D$3,3,0) 下にコピー B列の値(5,6,10)に対応した値がA列に表示される >>740 特にダメなことはないです 宗派もないのでなんでもいいです 新旧の対応表、思いつきませんでした >>741 ありがとうございます これでやってみます 分析をExcelでするってあまりメジャーではないのかな… 【1 OSの種類 .】 Windows7 【2 Excelのバージョン 】 2010 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 否 A列に動物名のリスト(数不定)があって、B1〜B4にはデータの入力規則(A列のリスト)を適用して動物を選べるようにします。 この際、プルダウンのリストを被らない候補のみ出るようにしたいのですがどうすればできますか? 重複を削除した作業列を使い、そちらをリストの対象にする 数式でもできるけどめんどくさい >>745 >>718 を追いかければいけるんじゃない? a列に入ってる項目の、最後の1文字を取ってb列に格納したいんだけどどうやるんでしょうか 最後の1文字は決まって「点」なんです >>748 直近の質問者ならレス番号、新規質問者ならテンプレ使ってね 他の質問者がいる状態でいきなり割って入られたらややこしくなる >>748 B1 =LEFT(A1,LEN(A1)-1) >>749 すみません 次から気をつけます >>750 ありがとうございます 【1 OSの種類 .】 Windows10 【2 Excelのバージョン 】 2010 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 可(否の方法があれば優先してお願いします) 例えばセルに"20"を入力した場合 その入力されたセルに"20(28)"のように表示させることが出来るなら方法を教えてください (28)に関しては「入力された値+8」で8は固定です >>752 関数や条件付き書式では無理 簡単なのは別セルにする方法 A1=5 B1=a1&"("&a1+8&")" 同じセルが必須ならvbaしかない。該当シートに記述すること Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Row = 3 And Target.Column = 2 Then Application.EnableEvents = False Cells(3, 2) = Cells(3, 2) & "(" & Cells(3, 2) + 8 & ")" Application.EnableEvents = True End If End Sub >>753 回答ありがとうございます VBAだと可能になるんですね 教えてもらった方法を参考にして この機会にVBAかじってみたいと思います 【1 OSの種類 .】 Windows10 【2 Excelのバージョン 】 2010 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 1行に70〜100セル程度にわたり数値が空白なしに横方向に羅列されてて 右に数値を追加していってるのですが最新50回分をグラフ表示するようにしたいと思っています。 数字を追加するたびにいちいちグラフの方の範囲を書き換えるのは面倒なので、その行の右側の50セル分の範囲を指定できるようにするにはどうすればいいですか? LOOKUP(10^10,A1:CZ1)で一番右の数値一個を取ることはできるのですが 【1 OSの種類 .】 Windows10 【2 Excelのバージョン 】 2013 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 否 今まで範囲指定した部分を160%に拡大してA4に印刷していたのですが、 Windows 10 Creators Update後に同じ作業をしたところ拡大率がおかしいです。 100%で9cmくらいの範囲が160%で9.5cmくらい、試しに400%にしたところ11cmくらいにしかなりません。 今までは160%ならば1.6倍に印刷出来ていたのですが・・・ >>755 まずそれ、横→縦にして方がいいね 新しい数字は下に追加していく そしたらいらない古いところはオートフィルタでチェックを外してくだけ >>755 オレだったら作業セルに最新50の数値をリンクさせそこをグラフ範囲にする 最新50のデータを作業セルにリンクさせるには、最終列番号を取得すればいい 例えば、1行の最終列番号(最新データの列番号)は、=MATCH(0,1:1, -1) >>756 Creators Updateは手動? WindowsUpdate? ・手動なら元に戻す ・WindowsUpdateなら MSのサポートを受ける かな? >>756 エクセルの印刷には期待するな 倍率とかはテキトーに調整して、うまくいったら次からそれで もしかすると新しいブックで設定し直すと、色々と変わるかもしれない >>759 レスどうもです。戻すしかないかあ ちなみにXP機では今まで通り印刷できました。 >>760 レスどうもです。新しいブックでも他のファイルでも同じでした。400%でも小さすぎて・・・ プレビュー表示でも同じなんです。 >>761 記事のURL出てこないんで示せないけど MSも手動のupdateは推奨してなかったと思うぜ ハードウェアまたはソフトウェアの互換性チェックがバイパスされるとかで >>761 プリンタの機種や設定は同じでWin10だけおかしくなる? 縮小して全体が入るように印刷、みたいなオプションがあったような >>763 今戻しました。 業務時間に降ってくると困るので暇な土曜日に手動でと思ったんですが甘かったです。 今、範囲指定&拡大印刷試してみたところ問題なしです。まったくなんなんでしょう 本番で不具合ないこと祈ります。 >>764 WIN10でもCreators Update後でだけです。 >>744 そか ほんじゃExcelでまずやってみんね ありがと 分析自分の仕事じゃないのになー >>757-758 ありがとうございます 参考にしてみます 【1 OSの種類 .】 Windows7 【2 Excelのバージョン 】 Excel2010 【3 VBAが使えるか .】 はい 【4 VBAでの回答の可否】 否 indirectで困ってます a1セルでシート名を入力 b1セルでそのシート内で検索したい言葉を入力 c1セルにその言葉が何列目にあるかを計算させる =match(b1,indirect(a1&"!5:5"),0) →正しい計算結果 これを2列めへコピーして、c2セルにペースト →REF indirectを使わずシート名で直接入力 →正しい計算結果 なぜでしょうか?ちょっと困惑しています >>768 Q1. C2セルの数式は どうなってる? それは 想定してるセル参照になってるの? Q2. 想定してるセル参照になってるとして そのセルの値は想定してる値になってる? >>769 今は自宅なので思い出して書いちゃってます10分程度格闘したのであっていると思います c2セルの数式は match(b2,indirect(a2&"!5:5),0)です Q2 参照および内容は、あっていると思います。 具体的にやったことを言いますと、 シート名は、シートのタブをクリックしてコピーペーストしたもので 項目名は、その検索するシートから当該項目をコピーペーストして入力したものです ちなみに、a2,b2にa1,b1と同じものを入力すると計算は正しく行われます >>770 =MATCH(B2,INDIRECT(A2&"!5:5"),0) として #REF! になる可能性があるのは 存在しないシート名をA2に指定した だと思うが そこ確認した? "Sheet1" なのに "Sheet1 " とか " Sheet1" とかも×よ >>770 >>771 書いておもったのだけど シート名にスペースがあるなら↓じゃないとダメだな =MATCH(B2,INDIRECT("'"&A2&"'!5:5"),0) >>771 1)シートのタブをクリックして、シート名をコピーペースト 2)手打ち 両方試みたんですがREFでしたね スペースなかったと思いますが確認してみます アンダーバー _があるとダメなのかなあ >>773 シート名が数字始まりとかもだよ どっちにしても772みたいにクォーテーション入れとくといい >>768 indirectで別シートを参照する時は、 ・別ブックの参照を自動的に取得する ブック二枚同時に開き、 a1に「=」だけ入力して参照先のセルをクリック こんなのが自動的に入力される ='C:\Users\a\Documents\[Book2.xlsx]Sheet1'!$A$1 indirectに入れる =indirect("'C:\Users\a\Documents\[Book2.xlsx]Sheet1'!$A$1",1) この順番で作業をすれば別ブック、シートの指定で間違うことはない >>775 >>774 シート名に-を含むのが悪さをすることが考えられました ダブルクォーテーションで囲むと回避できるのですかね? 明日試します >>776 あぁ、わかった シート名が「1-3」とかだろ A列ではそれが計算されて「-2」になっている 1-3!A1 ↓ -2!A1 これを避けたければA列、ついでにB1も文字列にしておくと良い 【1 OSの種類 .】 Windows10 【2 Excelのバージョン 】 Excel2013 【3 VBAが使えるか .】 はい (超初心者) 【4 VBAでの回答の可否】 可 ピポットテーブルを使っているのですが絞り込み昨日を使うとA列とB列の幅が 絞り込み機能と表が連動してしまい表が不格好になってしまいます。 絞り込み機能の幅と表の幅をべつにすることはできませんか? 質問です、excel2016でデータタブにあった外部データの読み込みが表示されなくなってしまっているのですが 再表示の方法わかりますでしょうか? >>777 まさにそういうつけ方をしていました -はシート名に使わない、をルールにしようと思います 回避策はダブルクォーテーションで囲うことですが、ルール化しておこうと思おます きちんとそのまま書くべきでした ハイフンは色々悪さをするから全てアンダーバーに統一すると良い よく、プログラムの出力結果csvをエクセルに取り込んで計算をするというか流れがあるけど、 その出力をindexとか使って参照するのか、手入力しちゃった方が早いのかどっちがいいのか悩む 参照があってるか確認しながら都度やるのもまた手間なのかなあと その辺は慣れだなぁ 俺はたまに正規化する 4月 5月 A支店 売上 1 2 A支店 経費 3 4 B支店 売上 5 6 B支店 経費 7 8 ↓ A支店 売上 4月 1 A支店_売上_4月 A支店 売上 5月 2 A支店_売上_5月 A支店 経費 4月 3 A支店_経費_4月 A支店 経費 5月 4 A支店_経費_5月 B支店 売上 4月 5 B支店_売上_4月 B支店 売上 5月 6 B支店_売上_5月 B支店 経費 4月 7 B支店_経費_4月 B支店 経費 5月 8 B支店_経費_5月 一回この正規化し直すマクロ組めば、index+matchで楽にどんなデータでも取得できる 正規化と言えないというツッコミはやめて下さい死んでしまいます 出力形式が変わらないなら計算式の入ったテンプレを作成しておいてcsvだけ入れ替えるのがいいと思う >>789 いやそれがケースバイケースでおおむね一致しているけど例外ってパターンが多い 例外ってどんなのよ、っていうと 例えば1列目をピックアップするってルールだけど、あるシートでは2列目にしなきゃとかそんなの >>790 マスターとなる大データを入れてそこからindex/matchで引っこ抜けるんジャマイカ? >>791 マスターとなる大でデータというイメージがよくわからないけど、使うプログラムは3種類って感じ >>788 正規化以前に全角/半角混在の方が気になるわ CSVファイルをExcelで開いたときに、勝手に値が変わっちゃうことがあって、気づかずに保存しちゃう人がいるんだけど、これってなんとかならないんですかねぇ… いちいちPC音痴の人に説明するのがめんどくさい そもそも誰が得する機能なんだろう >>794 特に何も考えてないんじゃないか 仕様ということで受け入れるしか無い 変わっていても変わっていなくても保存するなよ なんではいなんだよ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる