Non hai considerato alcune cose per capire e affrontare la questione.
Quando VB6 esegue un calcolo, valuta l'espressione a prescindere dalla variabile che sta a sinistra e che conterrà il risultato finale.
Il VB6 calcola prima
256 * arr(r * 2 + 1) + arr(r * 2 + 2)
e usa un'area temporanea per il risultato determinata dal tipo più grande che individua nell'espressione.
<area temporanea> = <espressione>
Se tutto va bene, in un secondo momento il VB6 esegue
variabile = <area temporanea>
Detto questo per l'espressione di cui parliamo, succede
<area temporanea> = 256 * arr(r * 2 + 1) + arr(r * 2 + 2)
e poi
value = <area temporanea>
il tipo più grande nell'espressione è il 256 (una costante integer a 2 byte, da -32768 a +32767) e quindi viene preparata un'area temporanea integer, Ma l'espressione dà un risultato di grandezza Long e quindi non entra nell'area temporanea da cui l'errore. La causa dell'errore è come è stata scritta l'espressione e il tipo di variabile a sinistra non ha alcuna rilevanza.
Per risolvere devi far creare al VB6 un'area temporanea Long e questo avviene indicando come Long uno dei termini. Nel tuo caso ti conviene intervenire sulla costante 256 indicando che è di tipo Long e tutto va a buon fine. Devi quindi aggiungere il carattere & alla costante perchè sia intesa Long e l'area temporanea sia creata di tipo Long
Quindi
value = 256& * arr(r * 2 + 1) + arr(r * 2 + 2)
Capito?
P.S. Dato che usi value solo per assegnarlo subito dopo, potresti non utilizzarlo e scrivere direttamente
BCSETPOINT(r) = 256& * arr(r * 2 + 1) + arr(r * 2 + 2)