Можно так:
Формула массива =ПОИСКПОЗ(1;ЕСЛИ(B18=B24:B43;1;0);0)
Возвращает номер «строки» массива, в данном случае 15. Длинна значения, условно, не имеет.
Потом производим смещение, в вашем случае так:
=СМЕЩ(D23;ПОИСКПОЗ(1;ЕСЛИ(B18=B24:B43;1;0);0);0;1;1)
Опять же, массивом.
Для ввода массива нужно вводить ctrl+shift+enter.
Но это для случая, когда при выборе из списка в ячейке b18 значение не «обрезается» до 255 знаков. В 2007 не обрезается, насчёт 2003 не уверен. Т е у вас сейчас там 255 знаков, если вы вручную сократили до 255, то верхняя формула подойдёт, если нет, то читаем дальше…
Как вариант, если происходит обрезание при выборе из выпадающего списка, поиск по тому же принципу первых 255 знаков по массиву из «обрезанных до 255 знаков» значений.
=СМЕЩ(D23;ПОИСКПОЗ(ПСТР(B18;1;255);ПСТР(B24:B43;1;255);0);0;1;1)
массив(ctrl+shift+enter).
Ищет первое совпадение первых 255 знаков ячейки b18 в массиве из значений «первых 255 знаков».
PS: формулы массива вводятся нажатием ctrl+shift+enter, а не просто enter.
Формулы массива не дружат с объединёнными ячейками. Для ввода формулы массива в объединённую ячейку, нужно вначале убрать объединение ячеек, потом ввести формулу массива, а потом опять объединить эти ячейки.
В файле-примере приведены оба варианта.
I am using OLE DB driver to insert more than 255 characters into an Excel sheet, but I get the error:
Exception Details: System.Data.OleDb.OleDbException: The field is too small to accept the amount of data you attempted to add. Try inserting or pasting less data.
Seems from this thread that it’s an Excel limitation. Even the Microsoft site seems to say so here.
So does this mean I can’t programmatically, but I can manually? Because I can enter more than 255 characters when I manually type them in Excel. So is it a Microsoft.ACE.OLEDB.12.0(AccessDatabaseEngine.exe) driver limitation?
asked Dec 20, 2010 at 9:35
0
My workaround to this issue is to add a text which its length is longer than 255 characters on the first row of the column. OleDB will treat this column as MEMO type and then it can insert more than 255 characters in a cell.
answered Jun 25, 2014 at 2:38
1
I found a more efficient way to handle this problem, my references are the 2 links below
http://support.microsoft.com/kb/316934
http://www.codeproject.com/Articles/37055/Working-with-MS-Excel-xls-xlsx-Using-MDAC-and-Oled
Basically do not use data adapter, data set and parameters to insert rows in the Excel (this never worked for me) instead run SQL insert from the code directly using command object
Here what you have to do
- Declare the wide field as MEMO instead of string or CHAR
«CREATE TABLE WorkSheetName ( field1 INT, field2 MEMO, field3 … );» - Build the insert statement like
«INSERT INTO WorkSheetName (field1, field2, …) VALUES (1234, ‘Any long string here…’, …)» -
Declare a DbCommand to run the Create table and Insert statements above, here I am using the command obj from enterprise library
DbCommand dbCommand = m_dbConnection.CreateCommand();
dbCommand.CommandText = «Create Table …»;
dbCommand.CommandType = CommandType.Text;
dbCommand.ExecuteNonQuery();dbCommand.CommandText = «Insert Into …»;
dbCommand.CommandType = CommandType.Text;
dbCommand.ExecuteNonQuery();
answered Jul 6, 2012 at 14:27
1
The link you are refering to, is about 256 columns and not characters. The 256 characters problem is described here with a workaround: http://support.microsoft.com/kb/213841
answered Dec 20, 2010 at 10:59
jvdbogaejvdbogae
1,2599 silver badges15 bronze badges
2
Форум программистов Vingrad
Модераторы: mihanik
Страницы: (2) Все [1] 2 |
Поиск: |
|
Как обойти ограничение в 255 символов? при использовании источников данных |
Опции темы |
Валк |
|
||
Шустрый Профиль Репутация: нет
|
При формировании мною данных (отчасти автоматическом) в ячейке Excel может быть размещено более 255 символов. При использовании источников данных (как пример, при копировании листов) в этом случае никакого слияния данных из этой ячейки не происходит. Как побороть? |
||
|
|||
Izuver |
|
||
Опытный Профиль
Репутация: 2
|
Можно по подробней о«При использовании источников данных (как пример, при копировании листов) в этом случае никакого слияния данных из этой ячейки не происходит» Добавлено @ 23:37
В ячейку я запихнул 6000 символов (это конечно не предел). В одной ячейке, в видимой части или при распечатке вижу 1360 символов. Символы были ввиде: |
||
|
|||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Izuver Попробуй открыть две книги. В любом листе одной из них в любую из ячеек запиши более 255 символов (любых, у меня, в частности, помимо обычных символьных использовались и служебные), затем щёлкни по по названию этого листа правой кнопкой манипулятора. В контекстном меню выбери Переместить/скопировать -> Выбираешь другую книгу -> Отмечаешь чек-бокс «Создавать копию» -> ОК (Внимание, в книге куда копируется лист не должно быть листа с именем как и у копируемого листа). Если у тебя в какой-либо ячейке более 255 символов, то Excel ругнётся, что не может скопировать все символы. У меня ситуация несколько другая (но она натыкается на такое же ограничение). Я использую слияние. Книга Excel у меня используется как источник данных из которого я их переношу в документ Word. Если в какой-либо ячейке получается более 255 символов, то эти данные либо переносятся не полностью, либо не переносятся вовсе. Я думал, что и в этом случае как-то можно обойти эту проблему. К сожалению, не получилось Вопрос означенный в теме я помечаю как решённый, однако если кто знает как побороть это ограничение, то прошу отписать тут. |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: нет
|
CopyWheet1(1, 1, 2, 1) — копирует с 1 книги 1 листа на 2 книгу 1 лист ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Romikgy |
||
|
|||
Romikgy |
|
||||
Любитель-программер Профиль
Репутация: нет
|
точнее ?
ты сказал , есть проблема с переносом длинных строк из одного листа книги на другой лист книги, я показал как ее обойти, также можно копировать в ворд, юзай только CopyLongString , правда ее переделать надо ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Romikgy также можно копировать в ворд, юзай только CopyLongString |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: нет
|
дык скажи че те конкретно надо , а не закоулками ЗЫ сверху есть кнопочка тыстрая цитата , те понравиться ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Romikgy Если интересует общая постановка задачи, то уже стыдно признаваться (ибо заранее знаю, что пошлют читать букварь). |
||
|
|||
Romikgy |
|
||||
Любитель-программер Профиль
Репутация: нет
|
не представляю, даже таких страшных слов не знаю
в качестве базы Эксель? ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Romikgy |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: нет
|
самый простой вариант , раздели надписи в ячейках , что бы было меньше 250 символов , или переноси как показал я через VBA , имхо так будет даже правильнее и документы можно и формировать и форматировать автоматически ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Romikgy документы можно и формировать и форматировать автоматически |
||
|
|||
Romikgy |
|
||
Любитель-программер Профиль
Репутация: нет
|
ну дык учи вба, если что тут помагать будут ——————— Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||
|
|||
Валк |
|
||
Шустрый Профиль Репутация: нет
|
Romikgy |
||
|
|||
Страницы: (2) Все [1] 2 |
|
Правила форума «Программирование, связанное с MS Office» | |
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми
Если Вам понравилась атмосфера форума, заходите к нам чаще! |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема » |
Как использовать более 255 символов в функции СЦЕПИТЬ в Excel? На самом деле я также использую функцию СЦЕПИТЬ в функции ГИПЕРССЫЛКА в EXCEL. Пример выглядит так:
=HYPERLINK(CONCATENATE("http://www.google/com/morethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255chars","morethan255chars morethan255charsmorethan255charsmorethan255charsmorethan25"),"link");
ОБНОВЛЕНИЕ: это не проблема с функцией СЦЕПИТЬ, а проблема с первым параметром функции ГИПЕРССЫЛКА. Использование строки длиной более 255 символов прямо / косвенно (например: = ГИПЕРССЫЛКА (K204, «ссылка»), где K204 содержит ссылку длиной 256 символов) приводит к сбою функции ГИПЕРССЫЛКА.
Я понимаю, что могу использовать укорочитель URL-адресов, но я делаю это для МНОГО ссылок, которые потребуют ВСЕГО ручного использования сокращателя URL-адресов.
12 ответов
Лучший ответ
ОБНОВЛЕНИЕ: из-за комментария Карла я пересмотрел свой ответ и обнаружил, что Excel 2007, похоже, не позволяет функциям, определяемым пользователем, больше устанавливать гиперссылки (вполне разумно, см. Мой собственный комментарий в коде). Таким образом, исходный код (под строкой) не работает в более поздних версиях Excel (я не тестировал Excel 2010, но предполагаю, что результат такой же). По историческим причинам я не удаляю старый код (редактор может подумать иначе — не стесняйтесь редактировать / удалять соответственно).
Остается установить длинные гиперссылки программно, например
Sub insertVeryLongHyperlink()
Dim curCell As Range
Dim longHyperlink As String
Set curCell = Range("A1") ' or use any cell-reference
longHyperlink = "http://www.veryLongURL.com/abcde" ' Or a Cell reference like [C1]
curCell.Hyperlinks.Add Anchor:=curCell, _
Address:=longHyperlink, _
SubAddress:="", _
ScreenTip:=" - Click here to follow the hyperlink", _
TextToDisplay:="Long Hyperlink"
End Sub
Следующее больше не работает в Excel 2010; см. мой комментарий выше
«Скопировать гиперссылку из Word и вставить в Excel» заставило меня задуматься. Таким образом, очевидно, что ограничение есть как во встроенной функции ГИПЕРССЫЛКИ, так и в диалоговом окне «редактировать гиперссылку». С другой стороны, должно быть — и это действительно возможно — установить более длинные гиперссылки через VBA.
Этот код больше не работает в Excel 2010
Function myHyperlink(cell As Range, _
hyperlinkAddress As String, _
Optional TextToDisplay As Variant, _
Optional ScreenTip As Variant)
' Inserts a Hyperlink
' at the position cell (this should be the position where the UDF is used,
' since the return value of the UDF is = TextToDisplay)
' with the hyperlinkAddress
' optional TextToDisplay
' optional ScreenTip
' #######################################
' Warning Warning Warning Warning Warning
' #######################################
' 1) Since it is really bad practice to have a function perform procedural
' tasks, you should not do this.
' 2) You have no garantee, the link is updated when the value hyperlinkAddress changes
' USE AT YOUR ONE RISK AND ONLY IN CASE OF EMERGENCIES :-)
' If more than one cell is selected as target range,
' use the top left cell
Set cell = cell.Resize(1, 1)
If IsMissing(TextToDisplay) Then
TextToDisplay = hyperlinkAddress
End If
If IsMissing(ScreenTip) Then
ScreenTip = hyperlinkAddress & " - Click here to follow the hyperlink"
End If
cell.Hyperlinks.Add Anchor:=ActiveCell, _
Address:=hyperlinkAddress, _
SubAddress:="", _
ScreenTip:=ScreenTip, _
TextToDisplay:=TextToDisplay
' There doesn't seem to be another way to set TextToDisplay
myHyperlink = TextToDisplay
End Function
Используйте как обычную функцию Excel, но обязательно добавьте текущую ячейку в качестве первого параметра (т.е. следующая формула вставляется в ячейку A1)
=myHyperlink(A1,B1)
=myHyperlink(A1,B1,"TextToDisplay", "ScreenTip")
Вы не можете ни перетащить формулу, ни скопировать ее в другую ячейку. Если вы это сделаете, вам нужно разрешить пересчет формулы (ни ALT-CTRL-F9, ни ALT-CTRL-SHIFT-F9, поскольку принудительный пересчет, похоже, не работают), поэтому войдите в каждую ячейку, нажмите F2, чтобы активировать ее, и закончите с Return.
Надеюсь, я не помогу вам испортить слишком много Excel-Workbooks.
Вероятно, безопаснее написать явно запускаемый VBA, который выполняет итерацию по списку и записывает в гиперссылки. Таким образом, их можно использовать повторно, и в них не будет никаких функций.
С уважением, Андреас
4
Andreas J
29 Окт 2013 в 12:25
Возможно, вам не повезло. Кажется, что ограничение на количество символов для гиперссылок в Excel составляет 256, как указано здесь . Если вы проверите это самостоятельно (у меня тоже есть Excel 2007), =HYPERLINK(REPT("a",255))
работает, а =HYPERLINK(REPT("a",256))
— нет, и выдает ошибку #VALUE! .
1
ktdrv
9 Окт 2010 в 00:17
У меня есть Excel 2007, и я попытался создать ячейку с 300 символами в A1 и другую с 300 разными символами в B1.
Затем я сделал C1 = CONCATENATE(A1, B1)
.
Я вижу всех персонажей из обеих ячеек. Ничего не пропущено или усечено, и ошибок не было. Мне это нравится.
Что заставляет вас думать, что конкатенация не работает? У вас проблемы с просмотром результатов? Если ваша ячейка содержит более 1024 символов, в ячейке отображаются только первые 1024 символа. Однако они все еще там, и если вы скопируете и вставите их, все символы будут скопированы.
Изменить: Теперь, когда вы отредактировали свой вопрос, я понимаю, что проблема связана с HYPERLINK
, а не с CONCATENATE
.
Единственный способ обойти ограничение в 255 символов формулы HYPERLINK
в Excel — скопировать гиперссылку из Word и вставить ее в ячейку Excel. Тогда это может быть очень долго. Я знаю, что это необоснованный ручной процесс, если у вас много ссылок, но кажется, что это единственный способ поместить его в электронную таблицу Excel и при этом все еще иметь гиперссылку, по которой можно щелкнуть и перенаправить. Если вам не нужно, чтобы он действовал как гиперссылка, я бы предложил переписать ваши запросы, чтобы гиперссылка возвращалась в виде собственного текстового поля, и тогда все будет в порядке.
1
hyprsleepy
9 Окт 2010 в 00:42
Вот пример VBA, который использует bitly.com для сокращения URL-адреса. Он основан на документации bitly API.
- Создайте бесплатную учетную запись на bitly.
- Действительный адрес электронной почты с bitly.
- Получите токен доступа от bitly.
- Замените токен доступа в коде VBA ниже, где написано MY_TOKEN.
- Скопируйте и вставьте код в Excel VBA.
- В ячейке напишите следующее ‘= Hyperlink (GetURL («какой-то действительно длинный URL»))’ без одинарных кавычек ‘. Примечание. Вместо передачи строки в GetURL () передайте ссылку на ячейку, в которой есть URL-адрес в виде текста.
Public Function GetURL(longUrl As String) As String Dim xml As Object longUrl = URLEncode(longUrl) Set xml = CreateObject("MSXML2.XMLHTTP.6.0") xml.Open "GET", "https://api-ssl.bitly.com/v3/shorten?format=xml&access_token=MY_TOKEN=" & longUrl, False xml.Send GetURL = xml.responsetext head = InStr(GetURL, "<url>") + 5 tail = InStr(GetURL, "</url>") GetURL = Mid(GetURL, head, tail - head) End Function Function URLEncode(ByVal Text As String) As String Dim i As Integer Dim acode As Integer Dim char As String URLEncode = Text For i = Len(URLEncode) To 1 Step -1 acode = Asc(Mid$(URLEncode, i, 1)) Select Case acode Case 48 To 57, 65 To 90, 97 To 122 ' don't touch alphanumeric chars Case 32 ' replace space with "+" Mid$(URLEncode, i, 1) = "+" Case Else ' replace punctuation chars with "%hex" URLEncode = Left$(URLEncode, i - 1) & "%" & Hex$(acode) & Mid$(URLEncode, i + 1) End Select Next End Function
1
Nathan
8 Янв 2014 в 00:35
Не знаю, если мой ответ все еще полезен, но у меня была такая же проблема пару дней назад, лучший способ и проверенный способ сделать работоспособную гиперссылку, превышающую ограничение в 255 символов, — сначала разделить ее с помощью CONCATENATE()
и использовать ячейка с функцией CONCATENATE()
в VBA
.
Для меня это выглядит так:
A1 = LinkPart1
A2 = LinkPart2
A3 = LinkPart3
A5 = CONCATENATE( A1; A2; A3 )
VBA
Код, который необходимо связать с A5
:
Sub insertVeryLongHyperlink()
Dim curCell As Range
Dim longHyperlink As String
Set curCell = Range("A7") ' or use any cell-reference
longHyperlink = [A5]
curCell.Hyperlinks.Add Anchor:=curCell, _
Address:=longHyperlink, _
SubAddress:="", _
ScreenTip:=" - Click here to follow the hyperlink", _
TextToDisplay:="Click Here"
End Sub
1
user3666197
11 Дек 2015 в 21:21
Вместо того чтобы писать
=CONCATENATE("Toto";"Tata")
Поместите Toto
в ячейку Z1 (например) и Tata
в ячейку Z2 и напишите
=CONCATENATE(Z1;Z2)
0
GôTô
8 Окт 2010 в 23:14
Функция гиперссылки имеет жесткий предел, который нельзя переступить. У меня была аналогичная проблема, и я просто импортировал лист Excel в Open Office Calc и вуаля — все сработало мгновенно, и гиперссылка, которая раньше была слишком долгой, теперь может существовать столько, сколько я хотел.
0
Hexodus
25 Ноя 2015 в 16:59
Вы можете использовать процедуру VBA Shell () для запуска браузера и передачи ему URL-адреса в командной строке, переданной через вызов Shell (). Таким образом, URL-адрес может иметь любую длину, поддерживаемую механизмом оболочки.
Кроме того, вы можете получить этот URL-адрес из любого значения ячейки, дважды щелкнув эту ячейку пользователем. Это значение может быть создано из множества ячеек с помощью одного вызова функции CONCATENATE ()! Правильно: всего один звонок. CONCATENATE () примет большое количество параметров и создаст строку длиной более 255 символов. Вам не нужно кропотливо объединять множество отдельных конкатенаций или использовать множество ячеек-строителей. Подойдет один!
Макрос необходимо создать, открыв параметр ПРОСМОТР КОДА, когда вы щелкаете правой кнопкой мыши вкладку в нижней части рабочего листа. Затем напишите следующий феноменально короткий, простой и безболезненный фрагмент кода:
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Selection.Count = 1 Then
If Left(Target.Value, 7) = "HTTP://" Then
Cancel = True
Shell ("""" + Range("Browser").Value + """" + " " + """" + Target.Value + """")
End If
End If
End Sub
Обратите внимание, что «Браузер» — это именованная ячейка, которая должна содержать путь вашего браузера без кавычек, будь то IE, Opera, Mozilla или Chrome. Вы должны назвать ячейку самостоятельно или изменить макрос, чтобы он имел жесткую ссылку на ячейку, например «A2». И, конечно же, это значение ячейки должно быть допустимым путем в браузере!
После того, как все это будет готово, вы можете дважды щелкнуть ЛЮБУЮ ячейку, значение которой начинается с текста «HTTP: //», и Excel откроет браузер с этим полным значением, независимо от его длины. Все, что вам затем нужно, это построить свою строку в этой ячейке и, возможно, отформатировать ее по цвету / шрифту, чтобы было очевидно, что это ячейка гиперссылки, которую нужно дважды щелкнуть. Текстовая подсказка рядом также может быть уместна!
Кстати, альтернативой строке Shell () в макросе является:
ThisWorkbook.FollowHyperlink Address:=Target.Value
Хотя это также будет обрабатывать URL-адреса, длина которых превышает 255 символов, я обнаружил, что эта функция FollowHyperlink () вызывает отправку URL-адреса ДВАЖДЫ. Один раз самой функцией Excel (предположительно, чтобы проверить ее), а затем снова браузером по умолчанию, который открывается в Excel! Это может быть нежелательно (и не в моем случае). Вот почему я решил использовать вместо этого функцию Shell ().
0
Alex T
18 Май 2017 в 07:06
Вы можете создать гиперссылку в Microsoft Word, а затем скопировать ее в Excel. По какой-то причине эти элементы гиперссылки не ограничены 255 символами, но вы не сможете использовать функцию HYPERLINK()
.
Источник
0
towe
29 Май 2019 в 08:58
Предполагая, что у вас не так много URL-адресов гиперссылок> 255 символов, просто используйте функцию Link. Функция ссылки доступна из контекстного меню. Нет необходимости переходить в Word или любое другое приложение MSOffice. Я знаю, что это работает, поскольку у меня есть URL-адрес длиной 281 символ, и этот работает. У меня есть только два очень длинных URL-адреса в моем листе, поэтому, когда / если они нуждаются в обновлении, я отмечаю, что они должны быть выполнены в целевой ячейке, а не в моем листе адресов гиперссылок.
0
H’berger
27 Мар 2020 в 16:34
Отработав ответ Андреаса Дж., вы можете использовать приведенный ниже фрагмент кода VBA для создания столбца гиперссылок из столбца простого -текстовые URI. Предполагая, что столбец A содержит URI в виде обычного текста, а столбец B содержит желаемый текст ссылки, следующий код проходит через каждую строку в Range("A:C")
и генерирует гиперссылку в столбце C:
Sub createLink(a As Range, b As Range, c As Range)
Dim curCell As Range
Dim longHyperlink As String
Dim linkText As String
Set curCell = a
longHyperlink = b
linkText = c
curCell.Hyperlinks.Add Anchor:=curCell, _
Address:=longHyperlink, _
SubAddress:="", _
ScreenTip:="", _
TextToDisplay:=linkText
End Sub
Sub insertLinks()
Dim a As Range, b As Range
Set a = Range("A:C")
For Each b In a.Rows
Dim curCell As Range, longHyperlink As Range, linkText As Range
Set curCell = b.Cells().Item(1, 3)
Set longHyperlink = b.Cells().Item(1, 1)
Set linkText = b.Cells().Item(1, 2)
If longHyperlink = "" Then
Exit For
End If
createLink curCell, longHyperlink, linkText
Next
End Sub
0
mark
19 Май 2021 в 18:14